如何在Android WebView中监听Cookie同意API的回调?
核心思路
保留原JS代码中的|| Promise.resolve()容错逻辑(处理consentApi未加载的情况),通过addJavascriptInterface暴露原生方法给JS,在Promise的then回调中触发原生逻辑。
步骤1:创建JS与原生的交互桥梁类
定义一个带@JavascriptInterface注解的类,提供JS可调用的方法:
public class ConsentBridge { private final Context mContext; public ConsentBridge(Context context) { mContext = context; } @JavascriptInterface public void onConsentGranted() { // 处理用户同意后的原生逻辑,注意需切回主线程操作UI ((Activity) mContext).runOnUiThread(() -> { Toast.makeText(mContext, "用户已同意Cookie,可执行后续操作", Toast.LENGTH_SHORT).show(); // 这里添加你需要的业务逻辑,比如加载特定资源、更新页面等 }); } }
步骤2:配置WebView并注入修改后的JS代码
开启WebView的JS支持,添加交互接口,在页面加载完成后注入修改后的JS:
WebView webView = findViewById(R.id.your_webview_id); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 添加JS接口,命名为"AndroidConsentListener",供JS调用 webView.addJavascriptInterface(new ConsentBridge(this), "AndroidConsentListener"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 注入JS:保留原Promise逻辑,将console.log替换为调用原生接口 String injectJs = "(window.consentApi?.consent('tidio-chat') || Promise.resolve()).then(() => {" + " AndroidConsentListener.onConsentGranted();" + "});"; webView.evaluateJavascript(injectJs, null); } });
关键说明
- 原代码中的
|| Promise.resolve()是JS层面的容错:如果window.consentApi不存在,直接resolve Promise,确保then回调一定会执行,无需修改这部分逻辑。 @JavascriptInterface注解是必须的,否则JS无法调用原生方法。- 原生方法中操作UI必须通过
runOnUiThread切换到主线程,因为JS调用默认在后台线程。
内容的提问来源于stack exchange,提问作者tw-S
相关产品推荐
相关产品推荐

