项目中有一个需求:用户购买完商品后评价,可以选择图片。评价的界面是一个web页面。刚开始跟着网上的代码弄完后,在测试机上运行正常,可是他们说自己的手机不行,就去百度了一下,奶奶个球,才发现安卓webview打开本地文件在3x、4x、5x上都不一样。甚至有些说因为安全原因,安卓4.4不支持webview打开本地文件(未验证)。我也是醉了,爱不一样就不一样吧,谁叫俺还要完成任务呢。下面就说说填坑的过程。
首先为了在多个Activity不用写重复的代码,新建一个 MyWebChomeClient 继承自 WebChomeClient
public class MyWebChomeClient extends WebChromeClient {
public MyWebChomeClient(OpenFileChooserCallBack openFileChooserCallBack) {
}
}
其次,写一个接口提供给Activity,让他来处理照片选择的逻辑
public interface OpenFileChooserCallBack {
// api低于 5.0 的回调
void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType);
// api高于 5.0 的回调
boolean openFileChooserCallBackAndroid5(WebView webView, ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams);
}
接下来为了适配不同版本的安卓,我们在这里添加不同版本webview掉用本地文件系统的方法
//3.0--版本
public void openFileChooser(ValueCallback<Uri> uploadMsg)
{
openFileChooser(uploadMsg, "");
}
//3.0++版本
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mOpenFileChooserCallBack.openFileChooserCallBack(uploadMsg, acceptType);
}
//4.1.1++版本
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
{
openFileChooser(uploadMsg, acceptType);
}
//5.0++版本
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams) {
Log.e("fileChooserParams","fileChooserParams");
mOpenFileChooserCallBack.openFileChooserCallBackAndroid5(webView, filePathCallback, fileChooserParams);
return true;
}
再来说说Activity:
首先设置webview
mWebView .loadUrl(url);//url为你要加载的url
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setAllowContentAccess(true);
webSettings.setBuiltInZoomControls(false);
其次在设置 webview 的 WebChromeClient 为我们新建的 MyWebChomeClient
mWebView.setWebChromeClient(new MyWebChomeClient(this));
在activity中实现MyWebChomeClient中的接口
@Override
public void openFileChooserCallBack(ValueCallback<Uri> uploadMsg, String acceptType) {
mUploadMsg = uploadMsg;
showOptions();
}
@Override
public boolean openFileChooserCallBackAndroid5
(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadMsgForAndroid5 = filePathCallback;
showOptions();
return true;
}
注:showOptions()方法为你想要的操作
还有就是注意当权限不足,或者其他原因导致返回为空时要设置相应的参数为空,否则将导致webview的等待,其他控件不能点击。
还有很多权限问题的操作本文并未涉,如果有需要可以去下载 demo 查看
这就是webview调用本地相机,相册的方法,当然,调用本地文件也一样。