webView.setWebChromeClient(new WebChromeClient() {})中实现:
String mCameraFilePath="";
int REQUEST_CODE_FILE_CHOOSER=107;
//5.0以下使用
private ValueCallback<Uri> uploadMessage;
//5.0以上使用
private ValueCallback<Uri[]> uploadMessageAboveL;
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int newProgress) {
Log.d("trest", "onProgressChanged: "+newProgress);
if (newProgress == 100) {
endchuli();
webView.getSettings().setBlockNetworkImage(false);
} else {
chulizhong();
}
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//此处进行逻辑处理
return false;//
}
@Override
public void openFileChooser(ValueCallback<Uri> valueCallback, String s, String s1) {
super.openFileChooser(valueCallback, s, s1);
uploadMessage = valueCallback;
showFileChooser();
// Toast.makeText(MainActivity.this, "点击上传图片A", Toast.LENGTH_SHORT).show();
quan();
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback, FileChooserParams fileChooserParams) {
// Toast.makeText(MainActivity.this, "点击上传图片B", Toast.LENGTH_SHORT).show();
uploadMessageAboveL = valueCallback;
showFileChooser();
quan();
// return super.onShowFileChooser(webView, valueCallback, fileChooserParams);
return true;
}
});
/**
* 打开选择图片/相机
*/
private void showFileChooser() {
Intent intent1 = new Intent(Intent.ACTION_PICK, null);
intent1.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
// Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT);
// intent1.addCategory(Intent.CATEGORY_OPENABLE);
// intent1.setType("image/*");
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
mCameraFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator +
System.currentTimeMillis() + ".jpg";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// android7.0注意uri的获取方式改变
Uri photoOutputUri = FileProvider.getUriForFile(
MainActivity.this,
BuildConfig.APPLICATION_ID + ".fileProvider",
new File(mCameraFilePath));
intent2.putExtra(MediaStore.EXTRA_OUTPUT, photoOutputUri);
} else {
intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
}
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_TITLE, "File Chooser");
chooser.putExtra(Intent.EXTRA_INTENT,intent1);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{intent2});
startActivityForResult(chooser, REQUEST_CODE_FILE_CHOOSER);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {//同上所说需要回调onReceiveValue方法防止下次无法响应js方法
if (uploadMessageAboveL != null) {
uploadMessageAboveL.onReceiveValue(null);
uploadMessageAboveL = null;
}
if (uploadMessage != null) {
uploadMessage.onReceiveValue(null);
uploadMessage = null;
}
return;
}
Uri result = null;
if(resultCode==RESULT_OK){
if(requestCode ==REQUEST_CODE_FILE_CHOOSER){
if (data != null) {
result = data.getData();
}
if (uploadMessageAboveL != null) {
onActivityResultAboveL(data);
} else if (uploadMessage != null) {
uploadMessage.onReceiveValue(result);
uploadMessage = null;
}
}
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(Intent intent) {
Uri[] results = null;
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)};
}
uploadMessageAboveL.onReceiveValue(results);
uploadMessageAboveL = null;
}