安卓WebView调起本地文件选择
场景:有时使用后台给的H5或者第三方SDK比如蚂蚁智能客服,当用webview去加载所给的H5中有上传本地文件时,点击上传按钮无反应。我用的是github上开源的AgentWeb(也可直接使用WebView)AgentVIew的用法很简单,这里就不赘述了。关键点:1、给WebVIew设置WebChromeClient时注意实现以下几个方法private ValueCallback<Uri&g
·
场景:有时使用后台给的H5或者第三方SDK比如蚂蚁智能客服,当用webview去加载所给的H5中有上传本地文件时,点击上传按钮无反应。
我用的是github上开源的AgentWeb(也可直接使用WebView)
AgentVIew的用法很简单,这里就不赘述了。
关键点:
1、给WebVIew设置WebChromeClient时注意实现以下几个方法
private ValueCallback<Uri> mUploadMessage;
private ValueCallback<Uri[]> mUploadCallbackAboveL;
private int FILE_CHOOSER_RESULT_CODE = 200;
private com.just.agentweb.WebChromeClient mWebViewClient = new com.just.agentweb.WebChromeClient() {
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> valueCallback) {
mUploadMessage = valueCallback;
// 检查权限
checkPermission();
}
// For Android >= 3.0
public void openFileChooser(ValueCallback valueCallback, String acceptType) {
mUploadMessage = valueCallback;
checkPermission();
}
//For Android >= 4.1
public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
mUploadMessage = valueCallback;
checkPermission();
}
// For Android >= 5.0
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackAboveL = filePathCallback;
checkPermission();
return true;
}
};
2、在onActivityResult做判断
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILE_CHOOSER_RESULT_CODE) {
if (null == mUploadMessage && null == mUploadCallbackAboveL) return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (mUploadCallbackAboveL != null) {
onActivityResultAboveL(requestCode, resultCode, data);
} else if (mUploadMessage != null) {
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
if (requestCode != FILE_CHOOSER_RESULT_CODE || mUploadCallbackAboveL == null)
return;
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (intent != null) {
String dataString = intent.getDataString();
ClipData clipData = intent.getClipData();
if (clipData != null) {
results = new Uri[clipData.getItemCount()];
for (int i = 0; i < clipData.getItemCount(); i++) {
ClipData.Item item = clipData.getItemAt(i);
results[i] = item.getUri();
}
}
if (dataString != null)
results = new Uri[]{Uri.parse(dataString)};
}
}
mUploadCallbackAboveL.onReceiveValue(results);
mUploadCallbackAboveL = null;
}
3、注意检查权限
// 相册照片读取权限检查
private void checkPermission() { // 权限检查
checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, null,
this::openImageChooserActivity, null);
}
这样WebView就能正常调起文件选择了
更多推荐
已为社区贡献6条内容
所有评论(0)