情景
需要在Webview中打开系统文件选择目录。即网页元素为: < input tyoe=”file” />,点击按钮应该打开系统的文件选择。
实现
1.重写WebChromeClient 方法
在 Webview.setWebChromeClient() 方法传入的参数 WebChromeClient 重写 openFileChooser() 或者 onShowFileChooser() …,返回true,处理情景中的点击事件,可以是打开系统文件、打开相机,比如下面的例子。
注意:这里的重写方法具体参照不同的SDK版本,下例只是适配了API 16+ 、API 21+,低版本应该现在也很少了。
/**
* 提供接口HTML调用系统相册 API 16+
*
* @author fengzhen
* @version v1, 2017/4/5 18:10
*/
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
asw_file_message = uploadMsg;
Intent chooserIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(chooserIntent, asw_file_req);
}
/**
* 提供接口HTML调用系统相册 API 21+
*
* @author fengzhen
* @version v1, 2017/4/5 18:10
*/
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
asw_file_path = filePathCallback;
// 直接调用系统相册
Intent chooserIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(chooserIntent, asw_file_req);
return true;
}
});
2.处理选择返回值
在onActivityResult()方法中处理返回值。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) return;
switch (requestCode) {
case asw_file_req:
// 结果处理
break;
}
}
3.Webview上传文件没有反应
单纯像上面那样处理,如果用户在文件选择按下返回键,会出现不能够再次进入文件选择的问题,需要在onActivityResult()添加如下代码:
/**
* 文件选择界面取消选择图片,解决返回之后不能选择图片的问题
*/
if (requestCode == asw_file_req && resultCode == RESULT_CANCELED) {
if (asw_file_path != null) {
asw_file_path.onReceiveValue(null);
asw_file_path = null;
}
if (asw_file_message != null) {
asw_file_message.onReceiveValue(null);
asw_file_message = null;
}
}