最近浏览器一直报出这样几个问题:
1.信息中心中访问百度地图网页版,无法定位到当前位置
2.浏览器全屏播放卡死,多次点击闪退
我用的webview是腾讯的x5 webview,一直以为很稳定,其实这个内核是需要下载的,可以设置在wifi或者手机流量上下载,然而在测试环境下,下载速度感人,可能下载失败,就需要重新下载。而测试刚刷机联网进去全局搜索,然后二级页面跳浏览器,此时内核大概率是没有下载成功替换的,而且,就算你是直接导入静态内核(操作有些麻烦,需要从微信下载内核,然后导出到电脑,然后把so库和\assets\webkit下的文件统一改成so以及lib前缀,然后导入As,很麻烦,而且体积很大)也需要耗费很多时间去读取so文件,此时就需要我们对webview进行手动支持了。
下面是我重写webview WebChromeClient的两个方法:
@Override
public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) {
CoolLogger.d(TAG, "onShowCustomView ");
super.onShowCustomView(view, customViewCallback);
showCustomView(view);
}
@Override
public void onHideCustomView() {
CoolLogger.d(TAG, "onHideCustomView ");
super.onHideCustomView();
hideCustomView();
}
});
...
private void hideCustomView() {
if (myView != null) {
ViewGroup parent = (ViewGroup) myView.getParent();
parent.removeView(myView);
parent.addView(webView);
myView = null;
if (null != webviewActivity) {
webviewActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// 取消全屏
final WindowManager.LayoutParams attrs = webviewActivity.getWindow()
.getAttributes();
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
webviewActivity.getWindow().setAttributes(attrs);
webviewActivity.getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
if (null != webviewActivity) {
webviewActivity.showStatusbarAndNavigation();
}
}
}
}
private void showCustomView(View view) {
ViewGroup parent = (ViewGroup) webView.getParent();
parent.removeView(webView);
// 设置背景色为黑色
view.setBackgroundColor(webviewActivity.getResources().getColor(R.color.black));
parent.addView(view);
myView = view;
// 设置全屏的相关属性,获取当前的屏幕状态,然后设置全屏
if (null != webviewActivity) {
// webviewActivity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置横屏
webviewActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//设置全屏
webviewActivity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
if (null != webviewActivity) {
webviewActivity.hideStatusbarAndNavigation();
}
}
if (null != webviewActivity) {
webviewActivity.hideStatusbarAndNavigation();
}
}
我这是fragment,外部的Activity还有一些界面需要在全屏的时候进行隐藏,但注意判空。当你重启进程后,这个内核大概率也是下载完了,就能使用x5提供的全屏方案进行处理,而不会调用你写的