加粗文字一定要看,才能明白原理,要不然会糊里糊涂,即便是实现功能,也不知原理,以后修改也麻烦。
Android的WebView内部屏蔽type=“file”,网页想在WebView内调用相机需要在setWebChromeClient重写onShowFileChooser方法。
在这个方法中发起Intent来打开支持提供文件的第三方应用,最后onActivityResult回调中将第三方应用提供的内容通过一个叫做 ValueCallback 的参数返回给Webview。
避免长篇幅,简单说了下原理。
现在都是大部分手机android都在5.0以上,可以直接使用onShowFileChooser方法,openFileChooser是之前android版本使用方法。
整理最简单的实现方法,代码简介,看起来不头疼。附上源码仅供学习参考
DEMO
https://download.youkuaiyun.com/download/qqsunman2/12042882
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
{
if (uploadMessage != null) {
uploadMessage.onReceiveValue(null);
uploadMessage = null;
}
uploadMessage = filePathCallback;
Intent intent = fileChooserParams.createIntent();
try{
startActivityForResult(intent, REQUEST_SELECT_FILE);
} catch (ActivityNotFoundException e){
uploadMessage = null;
Toast.makeText(getBaseContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
private void openImageChooserActivity() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);//在app中通过Intent从启动的应用程序中抓取图片
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "图像选择器"), FILECHOOSER_RESULTCODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (requestCode == REQUEST_SELECT_FILE) {
if (uploadMessage == null)
return;
uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
uploadMessage = null;
}
} else if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == mUploadMessage)
return;
// Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
// Use RESULT_OK only if you're implementing WebView inside an Activity
Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
} else
Toast.makeText(getBaseContext(), "无法上传图像", Toast.LENGTH_LONG).show();
}