Android如何将FCM令牌变量传出方法并用于WebView加载URL?
解决FCM令牌传入WebView URL的问题
首先你现有代码的核心问题是:FirebaseMessaging.getInstance().getToken()是异步操作,回调onComplete里的代码会在后续某个时间执行,但你现在在回调外面就拼接了URL并加载WebView,这时候android_token还没被赋值,所以URL里的令牌是空的。
下面用两种简单的全局变量方式解决,同时修正异步加载的问题:
方式一:Activity成员变量(最适合你的场景)
直接在你的Activity类里定义成员变量android_token,然后在回调拿到令牌后再拼接URL并加载WebView:
public class YourActivity extends AppCompatActivity { // 定义为Activity的成员变量(全局作用于当前Activity) private String android_token; private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); webView = findViewById(R.id.your_webview_id); setWebView(); // 先初始化WebView配置 // 获取FCM令牌 Task<String> refreshedToken = FirebaseMessaging.getInstance().getToken(); refreshedToken.addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (task.isSuccessful()){ android_token = task.getResult(); Log.d("TAG", "token: " + android_token); // 拿到令牌后才拼接URL并加载 String url = "https://www.website.com/index.php?token_FCM=" + android_token; webView.loadUrl(url); } else { // 处理获取令牌失败的情况,比如加载默认URL webView.loadUrl("https://www.website.com/index.php"); } } }); } private void setWebView() { // 这里写你的WebView配置代码,比如启用JavaScript等 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 其他配置... } }
方式二:Application全局变量(跨组件共享令牌时用)
如果你的App多个页面都需要用到这个令牌,可以自定义Application类:
- 创建自定义Application类:
public class MyApp extends Application { private String fcmToken; public String getFcmToken() { return fcmToken; } public void setFcmToken(String fcmToken) { this.fcmToken = fcmToken; } }
- 在
AndroidManifest.xml里注册这个Application:
<application android:name=".MyApp" <!-- 其他属性保持不变 --> > <!-- 你的Activity等配置 --> </application>
- 在Activity里使用:
public class YourActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); webView = findViewById(R.id.your_webview_id); setWebView(); Task<String> refreshedToken = FirebaseMessaging.getInstance().getToken(); refreshedToken.addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (task.isSuccessful()){ String token = task.getResult(); Log.d("TAG", "token: " + token); // 存入Application全局变量 ((MyApp) getApplication()).setFcmToken(token); // 拼接URL加载WebView String url = "https://www.website.com/index.php?token_FCM=" + token; webView.loadUrl(url); } } }); } private void setWebView() { // WebView配置代码 } }
关键提醒
一定要把webView.loadUrl()放到onComplete回调里面执行,因为只有回调触发时才真正拿到了有效的FCM令牌,否则URL里的令牌参数会是空值。
内容的提问来源于stack exchange,提问作者giulia9932
相关产品推荐
相关产品推荐

