最近公司项目需要在WebView
上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片。
解决问题之前我们先来说说WebView
上传文件的逻辑:当我们在Web页面上点击选择文件的控件(<input type="file">
)时,会回调WebChromeClient
下的openFileChooser()
(5.0及以上系统回调onShowFileChooser()
)。这个时候我们在openFileChooser
方法中通过Intent
打开系统相册或者支持该Intent
的第三方应用来选择图片。like this:
public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
uploadMessage = valueCallback;
openImageChooserActivity();
}
private void openImageChooserActivity() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(Intent.createChooser(i,
"Image Chooser"), FILE_CHOOSER_RESULT_CODE);
}
最后我们在onActivityResult()
中将选择的图片内容通过ValueCallback
的onReceiveValue
方法返回给WebView
,然后通过js上传。代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILE_CHOOSER_RESULT_CODE) {
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (uploadMessage != null) {
uploadMessage.onReceiveValue(result);
uploadMessage = null;
}
}
}
PS:
ValueCallbacks
是WebView
组件通过openFileChooser()
或者onShowFileChooser()
提供给我们的,它里面包含了一个或者一组Uri
,然后我们在onActivityResult()
里将Uri
传给ValueCallbacks
的onReceiveValue()
方法,这样WebView
就知道我