升级Android System WebView后JavaScript接口调用失效问题咨询
问题根因
这个是Android System WebView v92.0.4515.105版本的已知缺陷,而非Android 11的新增配置要求:该版本在运行Android 11的三星设备上存在JS交互权限校验逻辑异常,会错误拦截通过loadUrl触发的JS方法调用,其他品牌设备因为厂商定制的系统层逻辑差异,未触发这个异常。
另外你当前的JS调用代码存在两处语法问题,也可能导致执行失败:一是第二个字符串参数缺少开头单引号,二是代码末尾缺少右括号,修正后的基础写法为this.webView.loadUrl("javascript:updateGps('dummy','dummy')");
可行解决方案
- 替换JS调用方式
Android 4.4及以上系统官方推荐使用evaluateJavascript替代loadUrl执行JS代码,v92版本WebView对loadUrl方式的JS调用增加了更严格的同源校验,三星Android 11设备上恰好触发了异常拦截,替换写法如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { webView.evaluateJavascript("updateGps('dummy','dummy')", new ValueCallback<String>() { @Override public void onReceiveValue(String result) { // 若不需要处理JS方法的返回结果,此处可留空 } }); } else { // 兼容Android 4.4以下系统 webView.loadUrl("javascript:updateGps('dummy','dummy')"); }
- 新增适配配置
在你的setupWebViewClients方法中补充如下配置,适配高版本WebView的权限要求:
// 开启内容访问权限 webView.getSettings().setAllowContentAccess(true); // 针对三星Android 11设备单独关闭硬件加速,规避渲染层异常导致的交互失效 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R && Build.MANUFACTURER.equalsIgnoreCase("samsung")) { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
- 临时降级方案
若应用来不及发版更新,可引导用户在系统设置的应用列表中找到「Android System WebView」,选择卸载更新回退到v91及更早版本,即可临时恢复功能。
内容的提问来源于stack exchange,提问作者Junia Montana
相关产品推荐
相关产品推荐

