You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类:

  1. 创建自定义Application类:
public class MyApp extends Application {
    private String fcmToken;

    public String getFcmToken() {
        return fcmToken;
    }

    public void setFcmToken(String fcmToken) {
        this.fcmToken = fcmToken;
    }
}
  1. 在AndroidManifest.xml里注册这个Application:
<application
    android:name=".MyApp"
    <!-- 其他属性保持不变 -->
    >
    <!-- 你的Activity等配置 -->
</application>
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:42:14