我将提出一个我的问题的修改示例来简化这个问题,但我的完整示例的本质是相同的:
我需要在webview中加载一个html代码,这段代码假定要声明一些javascript函数.示例HTML代码:
JavaScript Math.random()
A random number:
在此示例中,代码假定已调用的已声明函数showRandomValue()
.所以我需要在执行代码之前注入此函数.这是我要注入的功能:
直到现在我在加载webview中的代码之前这样做了:
public static final String JAVASCRIPT_FUNCTION = "javascript:function showRandomValue() {\n" + " document.getElementById(\"demo\").innerHTML = Math.random();\n" + " }"; webView.loadUrl(JAVASCRIPT_FUNCTION); webView.loadData(HTML_CODE, "text/html", "UTF-8");
这对我很有用,直到我想将targetSdkVersion更新为24.如果我设置targetSdkVersion 24
此代码停止工作,因为代码加载时找不到该函数.
修改android WebView文档我发现了这个:
兼容性说明.针对N或更高版本的应用程序,来自空WebView的JavaScript状态不再在loadUrl(String)等导航中保留.例如,在加载的页面中不存在调用loadUrl(String)之前定义的全局变量和函数.应用程序应使用addJavascriptInterface(Object,String)来跨导航持久化JavaScript对象.
我的问题是addJavascriptInterface
你可以声明一个自定义对象,所以我可以声明:
webview.addJavascriptInterface(new MyInterface(),"javaInterface");
并在例如中调用其方法javaInterface.getRandomValue()
.但是我不能用这种方法声明全局函数.
重要提示:我无法编辑或修改HTML代码,因为它来自第三方服务器.
如何让这段代码再次在android 7+中运行?
如果要测试它,这是完整的示例代码:
public class MainActivity extends Activity { private WebView webView; String HTML_CODE = "\n" + "Hello World
\n" + "A random number:
\n" + "\n" + "\n" + "\n" + ""; public static final String JAVASCRIPT_FUNCTION = "(function showRandomValue() {document.getElementById(\"demo\").innerHTML = Math.random();})"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("javascript:" + JAVASCRIPT_FUNCTION); webView.loadData(HTML_CODE, "text/html", "UTF-8"); } }
使用targetSdkVersion 23编译此代码将起作用,而targetSdkVersion 24将无法显示随机数