说起来android适配webview就是比较烦人,本人遇到过很多坑,但是之前从来没有过记录,例如:文件选择框,toast弹框,视频不正常播放,视频各种不全屏(网上说的方法都不行时候就崩溃了,有机会说),两端方法互调,视频和语音播放不停止问题,http和https切换时图片不显示问题,等等
在这里我要说一嘴,一个很重要的东西:QQ,微信等腾讯系列软件一般都用的是腾讯X5内核的webview,并非原生的webview,如果看到和微信,QQ,还有大部分浏览器打开页面效果展示不同,请不必在意。因为内核不一样,你也可以继承腾讯X5的内核,它的某些效果封装的略强于原生webview,有的不如webview,各有利弊,国内好多手机都自定制webview,导致原生浏览器打开效果也略有不同,不必在意,我不推荐使用腾讯X5的webview,因为我比较懒,而且并没有感觉到明显的优点,好像腾讯X5内核的webview还并不是完全免费
说到这我在来说下关于webview的轻量级框架,AgentWeb,当然基于腾讯X5内核的也有,但是不做说明了,你们可自行百度AgentWeb的用法,确实比较简单,封装效果比较好。个人并不喜欢集成,1.因为不如自己写的灵活。2.有什么bug也不在自己的控制之内。3.感觉自己封装一个也很速度哈,无非是把那常用的几点适配好就可以了
以前解决的时候没有去特意记录,今天又遇到一个正好记录一下,关于webview选择文件,先看效果
先看一个在微信上打开的效果:
再看一个在app内部打开的效果:
最后的是咱们想要的效果:
还有几种效果就不一一列举了,还有就是直接到选择文件界面,还有的是微信,QQ和app内部不一样,其实很简单的,h5的小伙伴调用的是文件选择,至于如何选择就要咱们这边的壳子做处理了,因为嵌套的是h5页面,这个webview控件就暂且称作壳子吧。需要新建CustomWebChromeClient类的对象,并且重写打开文件的方法,各个版本之间的方法还不一样,对现在来说其实只考虑5.0以上就行了,为了安全起见就都写一下吧,附上代码
// For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
if (activity.getClass() == WebViewNewActivity.class) {
((WebViewNewActivity) activity).mUploadMessage = uploadMsg;
}
mUploadMessage = uploadMsg;
getPicture();
}
//For Android 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
if (activity.getClass() == WebViewNewActivity.class) {
((WebViewNewActivity) activity).mUploadMessage = uploadMsg;
}
mUploadMessage = uploadMsg;
getPicture();
}
// For >= Lollipop 5.0
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
/*
* lk改,webview打开图片
* */
uploadMessage = filePathCallback;
getPicture();
return true;
}
getPicture()这个方法中写处理,我写的是弹出自定义的弹框,至于是拍照,还是选择照片,或者选择文件都可以自己添加的,很简单,一定注意,要加权限判断啊
/*
* 获取照片的方法
* */
public void getPicture() {
SetUpDialogPictureH5 dialogPicture = new SetUpDialogPictureH5(WebViewNewActivity.this, new SetUpDialogPictureH5.ArticlePcutureOnClickListener() {
@Override
public void btnTakePicListener() {
// 拍照
// 拍照
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
||ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(WebViewNewActivity.this, new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.PERMISSION_CAMERA);
} else {
cameraPic();
}
} else {
cameraPic();
}
}
@Override
public void btnGetAlbumPicListener() {
//相册
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(WebViewNewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(WebViewNewActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}
, Constants.READ_WRITE_STORAGE);
} else {
startImagePick();
}
} else {
startImagePick();
}
}
@Override
public void btnCancelListener() {
restoreNeiRong();
}
},true);
}
至于是否授予权限的处理结果的代码我就不贴了,自己写就行了,我主要是提供一下思路,别忘记对图片进行压缩处理。