Android 9.0,WebView中,应该如何实现 JS和Java原生代码的交互?

问题描述


情况如下:有很多用户升到了Android 9.0系统。然后我们公司的同事发现,以往常用的三种 js和原生Java交互的方式,失效了:

方式1:通过 WebView的addJavascriptInterface()进行对象映射
@JavascriptInterface

方式2:通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url

方式3:通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调
拦截JS对话框alert()、confirm()、prompt() 消息

(以上3种方式,都无法实现  js和原生Java交互。在  Android 9.0 版本之下。)

而且,还出现了以下问题:

在WebView的网页中,通过  document.location.href = 'https://www.baidu.com',
类似这样的代码,
无法实现网页跳转。

(此处,为了避免  Android 9.0 对于 http协议的安全限制,这里采用了  https://头的协议。)

(也可能因为这个无法跳转的原因,导致shouldOverrideUrlLoading ()回调拦截 url  ,无法生效???)



问题出现的环境背景及自己尝试过哪些方法


网上似乎很难找到相关的资料?

我只在 StackoverFlow,看到了2篇, WebView不能正常 loadUrl的文章,但这似乎 和本问题无关。



相关代码


因为源代码过于冗长,这里就先不贴上来了。


现有的  Android端源代码,以及  WebView里面的代码,  
在  Android 8.1  至  Android 4.4.4  的版本之间,
都是可以正常运行、正常实现  js和原生Java  的交互的。


目前经过试验的结果,只有  Android 9.0  系统的Android机器,出现了本次描述的问题。



你期待的结果是什么?实际看到的错误信息又是什么?


Android 9.0 ,不能用老方式实现 js和原生之间交互,的原因是什么?

是不是因为 9.0 新特性的出现,需要 修改部分代码?

有没有什么我没注意到的 WebView配置的坑?

或者,应该采用什么新的办法,来兼容 Android 9.0 平台之上的 js和原生Java之间的交互?

阅读 4.7k
2 个回答
新手上路,请多包涵

这个问题目前有答案了吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题