第一步:重写WebChromeClient方法,基本上适配5.0以上就ok了。
protected ValueCallback<Uri> mUploadMessage;
protected ValueCallback<Uri[]> mUploadMessages;
//重写WebChromeClient方法
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
Log.i("test", "openFileChooser 1");
mUploadMessage = uploadMsg;
choosePicture();
}
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsgs) {
Log.i("test", "openFileChooser 2");
mUploadMessage = uploadMsgs;
choosePicture();
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
Log.i("test", "openFileChooser 3");
mUploadMessage = uploadMsg;
choosePicture();
}
// For Android >= 5.0
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams) {
if (mUploadMessages != null) {
mUploadMessages.onReceiveValue(null);
mUploadMessages = null;
}
mUploadMessages = filePathCallback;
choosePicture();
return true;
}
第二步, choosePicture()声明权限,并且动态申请权限
RxPermissionsUtils.requestPermission(this, Manifest.permission.CAMERA, new RxPermissionsUtils.PermissionCallBack() {
@Override
public void isSuccess(boolean isTrue) {
if(isTrue) _pickPhoto();
else LSToast.getInstance(context).show("获取权限失败",Toast.LENGTH_SHORT);
}
});
第三步,进行相册以及拍照的功能实现
/**
* 选择图片
*/
public void takePhotos(Activity activity, DialogInterface.OnClickListener listener,DialogInterface.OnCancelListener cancelListener) {
String[] selectPicTypeStr = {"相机", "文件/图片"};
AlertDialog alertDialog = new AlertDialog.Builder(activity)
.setTitle("请选择操作")
.setItems(selectPicTypeStr,listener).setOnCancelListener(cancelListener).show();
//放在show()之后,不然有些属性是没有效果的,比如height和width
Window dialogWindow = alertDialog.getWindow();
WindowManager m = activity.getWindowManager();
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
// 设置宽度
p.width = (int) (d.getWidth() * 0.95); // 宽度设置为屏幕的0.95
p.gravity = Gravity.CENTER;//设置位置
//p.alpha = 0.8f;//设置透明度
dialogWindow.setAttributes(p);
}
//选择图片
private void _pickPhoto() {
webViewRequestModel.takePhotos(this, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
// 相机拍摄
case 0:
openCarcme();
break;
// 手机相册
case 1:
openFileChooseProcess();
break;
default:
break;
}
}
}, new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (mUploadMessages != null) {
Uri[] uris = new Uri[1];
uris[0] = Uri.parse("");
mUploadMessages.onReceiveValue(uris);
mUploadMessages = null;
} else {
if(mUploadMessages!=null) {
mUploadMessages.onReceiveValue(null);
}
mUploadMessages = null;
}
}
});
}
/**
* 打开照相机
*/
Uri cameraUri;
// 必须确保文件夹路径存在,否则拍照后无法完成回调
File vFile ;
private void openCarcme() {
vFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
,System.currentTimeMillis() + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraUri= FileProvider.getUriForFile(this, this.getPackageName(), vFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
startActivityForResult(intent, 11);
}
onActivityResult中写入回调
case 11:
if (mUploadMessages == null) {
return;
}
afterOpenCamera();
Uri[] uris = new Uri[1];
uris[0] = Uri.fromFile(vFile);
mUploadMessages.onReceiveValue(uris);
mUploadMessages = null;
break;
/**
* 拍照结束后
*/
private void afterOpenCamera() {
addImageGallery(vFile);
}
/**
* 解决拍照后在相册中找不到的问题
*/
private void addImageGallery(File file) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
//打开相册
private void openFileChooseProcess() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
startActivityForResult(Intent.createChooser(i, "Chooser"), 10);
}
if (null != mUploadMessage) {
Uri result = data == null || resultCode != RESULT_OK ? null
: data.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
if (null != mUploadMessages) {
Uri result = data == null || resultCode != RESULT_OK ? null
: data.getData();
mUploadMessages.onReceiveValue(new Uri[]{result});
mUploadMessages = null;
}
if (resultCode != RESULT_OK)
if (mUploadMessages != null) {
Uri[] uris = new Uri[1];
uris[0] = Uri.parse("");
mUploadMessages.onReceiveValue(uris);
mUploadMessages = null;
} else {
if(mUploadMessages!=null) {
mUploadMessages.onReceiveValue(null);
}
mUploadMessages = null;
}
最后附上,Android 7.0以上别忘了添加provider的配置。