最近在线上发现一个bug,有些特殊的机型下,异步的js中对location.href的设置,不会被java中自定义的webview中的shouldOverrideUrlLoading所截获。
有点绕口,不如这样讲
1. Android中能够对webview进行自定义
比如希望所有url打开的时候,不要再新的窗口中打开,而在webview中打开,可以如下
mWebView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
2. 但是android 2.3.x系列的机器 , 有个bug
以下这个url打开的动作,自定义的webview截获不了
a. js中setTime之后,再给location.href赋值
b. Ajax中,作为callback处理, 给location.href赋值
c. form提交中的url迁移
参考:http://stackoverflow.com/questions/5228926/shouldoverrideurlloading-not-executed-if-window-location-href-modified-in
为了对应这个问题,自然想到用JsInterface来代替自定义webview
如下,也能解决问题
JsInterface jsObject = new JsInterface(TopActivity.this, webView);
webView.addJavascriptInterface(jsObject, "android");
但是,没想到,Android 2.3 并且 WebView中jsEngine是JSC的时候,用JsInterface会导致应用崩溃。。。。
参考:http://code.google.com/p/android/issues/detail?id=12987
当然,我又想到用代码判,如果发现当前的WebView中jsEngine是JSC的时候,就做特殊处理
找来找去,结果发现判断JsEngine的代码只有javascript能做到
if (window.devicePixelRatio) { //If WebKit browser
var st = escape(navigator.javaEnabled.toString());
if (st === 'function%20javaEnabled%28%29%20%7B%20%5Bnative%20code%5D%20%7D') {
document.write('V8 detected');
} else {
document.write('JSC detected');
}
} else {
document.write("Not a WebKit browser");
}
Android 里面 java如何调用javascript并且取到返回值呢。。答案就是用JsInterface
webView.loadUrl("javascript:android.checkTheWebViewCore(showJsEngine())");
if ("JSC".equals(jsObject.checkResult) && SystemUtils.isGingerbread()) {
isJCSandAndroid2point3 = true;
}else {
isnotJCSandAndroid2point3 = true;
}
!!!但是,既然android 2.3.x &&JSC的场合下,根本就不能用Jsinterface,那我怎么能用Jsinterface来调用javascript呢。。。。。。。
这是个无解的bug,无语了。
如果你买的是android 2.3.x 并且不幸你的webview的JsEngine的内核是JSC的话,我只能告诉你,你中彩了。。。。。。
以上,from tokyo
分享到:
相关推荐
webview全称叫做Android System WebView,它是Android生态系统的重要组成部分,也是Chrome浏览器的内核。可以让你的手机变得瞬间畅通,它会及时优化网页相关数据,有着接入式的操作体验数据,各种类型的应用程序可...
这是AOSP Webview, 包名com.android.webview, 不带google的 也是Android 7.1 最后一个支持版本 带google包名的可以下载 google system webview覆盖安装,可以略过
标题中的"com.android.webview-95.0.4638.50"指的是Android系统中的一个关键组件,即WebView。WebView是一个内置的浏览器引擎,允许Android应用程序(App)在不离开应用的情况下显示网页内容。它相当于一个轻量级的...
android system webview 适配系统>=5.0
Android System WebView 包名:com.android.webview 版本:95.0.4638.79 minAPI:21
Android webview apk 版本:115.0.5790.138,兼容32/64位。
适用于安卓5,armv8a和armv7a
安卓内置的浏览器内核,适用于x86构架,如:华硕ze551ml....,最低系统要求安卓5.0.........................................................................................................................
在Android平台上,WebView是一个至关重要的组件,它允许开发者在应用程序中嵌入网页浏览功能,而无需启动完整的浏览器应用。在给定的标题“android webview 版本69.0”中,提到的是一个特定版本的WebView,即69.0。...
这是AOSP Webview, 包名com.android.webview, 不带google的 带google包名的可以下载 google system webview覆盖安装,可以略过
这是AOSP Webview, 包名com.android.webview, 不带google的 带google包名的可以下载 google system webview覆盖安装,可以略过 此文件包含 arm和arm64的webview这是AOSP Webview, 包名com.android.webview, 不带...
这是AOSP Webview, 包名com.android.webview, 不带google的 带google包名的可以下载 google system webview覆盖安装,可以略过 此文件包含 arm和arm64的webview
C# Xamarin.Android WebView 只有一个单页面程序 Input调用手机摄像头上传图片,或通过选择器选中拍照还是图片 Js交互传递Location坐标信息 动态申请权限 开发版本:Visual2019,Visual2022编译通过 注意: ...
在VS.NET桌面程序中引入Web控件,实现在.NET桌面程序中集成h5页面,并呈现良好的显示效果。去除了EO.WebBrowser.WebView第一次加载时弹框的问题,并且保证视频在EO.WebBrowser.WebView中的正常播放
在初始化 WebView 时,我们需要设置调用 webview.setWebChromeClient(new MyWebChromeClient()); 这样我们就可以使用自定义的对话框行为。 在 Webview 载入的 html 中,我们可以使用 window.alert、window.confirm ...
Android System WebView 包名:com.google.android.webview 版本:123.0.6312.42-631204201 minAPI:26
Android System WebView 包名:com.android.webview 版本:105.0.5195.136 minAPI:23
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,无需跳转到外部浏览器。这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解...
然而,在加载 HTTPS 和 HTTP 网页时,WebView 可能会出现一些问题,本文将详细介绍这两个错误的解决方法。 错误一:加载 HTTPS 请求的网页时,WebView 变成空白页 在 Android 中,当 WebView 加载 HTTPS 请求的...