android webview中h5调用 拍照/相册 通用支持代码。
在webview的 WebChromeClient 中,重写
// For Android >= 5.0
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {mUploadCallbackAboveL = filePathCallback;takePhoto();return true;}// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {mUploadMessage = uploadMsg;takePhoto();
}// For Android >= 3.0
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {openFileChooser(uploadMsg);
}//For Android >= 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {openFileChooser(uploadMsg);
}
/*** 调用相机/相册选择窗*/private void takePhoto() {String filePath = Environment.getExternalStorageDirectory() + File.separator+ Environment.DIRECTORY_PICTURES + File.separator;String fileName = "IMG_" + DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg";imageUri = Uri.fromFile(new File(filePath + fileName));
//相册相机选择窗Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);Intent Photo = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);Intent chooserIntent = Intent.createChooser(Photo, "Image Chooser");chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent});activity.startActivityForResult(chooserIntent, REQUEST_CODE);}
/*** Android API < 21(Android 5.0)版本的回调处理** @param resultCode 选取文件或拍照的返回码* @param data 选取文件或拍照的返回结果*/
public void chooseBelow(int resultCode, Intent data) {Log.e("WangJ", "返回调用方法--chooseBelow");if (Activity.RESULT_OK == resultCode) {updatePhotos();if (data != null) {// 这里是针对文件路径处理Uri uri = data.getData();if (uri != null) {Log.e("WangJ", "系统返回URI:" + uri.toString());mUploadMessage.onReceiveValue(uri);} else {mUploadMessage.onReceiveValue(null);}} else {// 以指定图像存储路径的方式调起相机,成功后返回data为空Log.e("WangJ", "自定义结果:" + imageUri.toString());mUploadMessage.onReceiveValue(imageUri);}} else {mUploadMessage.onReceiveValue(null);}mUploadMessage = null;
}在webviewActiviy的onActivityResult中,回调下方代码,将图片返回给h5/*** Android API >= 21(Android 5.0) 版本的回调处理** @param resultCode 选取文件或拍照的返回码* @param data 选取文件或拍照的返回结果*/
public void chooseAbove(int resultCode, Intent data) {Log.e("WangJ", "返回调用方法--chooseAbove");if (Activity.RESULT_OK == resultCode) {updatePhotos();if (data != null) {// 这里是针对从文件中选图片的处理Uri[] results;Uri uriData = data.getData();if (uriData != null) {results = new Uri[]{uriData};for (Uri uri : results) {Log.e("WangJ", "系统返回URI:" + uri.toString());}mUploadCallbackAboveL.onReceiveValue(results);} else {mUploadCallbackAboveL.onReceiveValue(null);}} else {Log.e("WangJ", "自定义结果:" + imageUri.toString());mUploadCallbackAboveL.onReceiveValue(new Uri[]{imageUri});}} else {mUploadCallbackAboveL.onReceiveValue(null);}mUploadCallbackAboveL = null;
}private void updatePhotos() {// 该广播即使多发(即选取照片成功时也发送)也没有关系,只是唤醒系统刷新媒体文件Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);intent.setData(imageUri);activity.sendBroadcast(intent);
}