由于项目需求,需要在一个h5页面上实现图片上传的功能。实现的过程是,当用户点击<input type="file">时,webview会监听到这个事件接着在android原生这部分获取选中图片并将路径传回给h5页面处理并上传。监听这个选择图片的监听是需要去继承一个WebChromeClient并重写它里面的方法,因为由于各个系统版本webview的差异是需要重写多个方法才能适配不同的系统版本的手机,代码如下:
private class MyWebClient extends WebChromeClient {
// For Android 5.0+
//接受一个uris[]
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback , FileChooserParams fileChooserParams) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--5.0+");
mValueCallback = valueCallback;
goToPhotos();
return true;
}
// For Android 3.0+
//只能单独传一个uri
public void openFileChooser(ValueCallback uploadMsg) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0+");
mValueCallbackSingle = uploadMsg;
goToPhotos();
}
//3.0--版本
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0");
openFileChooser(uploadMsg);
}
// For Android 4.1
public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--4.1");
openFileChooser(uploadMsg);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "newProgress--newProgress--"+newProgress);
super.onProgressChanged(view, newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
LuheLogUtils.LogI("LuheGoodsShowActivity", "onReceivedTitle--title--" + title);
super.onReceivedTitle(view, title);
}
}
从代码中开出每次监听都会返回一个valueCallback对象,而这个对象是负责将我们获取到的图片路径传给h5页面 。
mValueCallback.onReceiveValue(uris);
但是这里有个问题需要注意的是如果打一次触发了监听返回mValueCallback没有调用onReceiveValue方法,下一次点击时<input type = file>就不会再次触发监听了,所以会造成无论怎么点都没有反应这种情况,为了解决这个问题需要在没有选中图片路径的情况下mValueCallback.onReceiveValue(null)传一个空值,这样就不会在出现没有选中图片后,下次点击没有反应的情况了。最后 webview的坑很多,开发的时候要多加注意。