1、首先需要给webview的WebChromeClient
设置以下代码,才可以实现h5与Android交互选取图片
private ValueCallback<Uri> mValueCallbackUri;
private ValueCallback<Uri[]> mValueCallbackUris;
this.setWebChromeClient(new WebChromeClient() {
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
if (mValueCallbackUri != null) {
mValueCallbackUri.onReceiveValue(null);
mValueCallbackUri = null;
}
mValueCallbackUri = uploadMsg;
showOptions();
}
//For Android 3.0 - 4.0
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
if (mValueCallbackUri != null) {
mValueCallbackUri.onReceiveValue(null);
mValueCallbackUri = null;
}
mValueCallbackUri = uploadMsg;
showOptions();
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
if (mValueCallbackUri != null) {
mValueCallbackUri.onReceiveValue(null);
mValueCallbackUri = null;
}
mValueCallbackUri = uploadMsg;
showOptions();
}
// For Android > 5.0支持多张上传
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback<Uri[]> uploadMsg,
FileChooserParams fileChooserParams) {
if (mValueCallbackUris != null) {
mValueCallbackUris.onReceiveValue(null);
mValueCallbackUris = null;
}
mValueCallbackUris = uploadMsg;
showOptions();
return true;
}
});
2、点击h5页面设置的<input type="file" name="pic" accept="image/*">
,就会调用到Android webview设置的openFileChooser
或者onShowFileChooser
3、然后在openFileChooser
或者onShowFileChooser
中调用打开相册的代码即可
1)方法一:打开相册,并且只支持选择单张图片
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 调用
activity.startActivityForResult(intent, TYPE_GALLERY);
或者
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
activity.startActivityForResult(Intent.createChooser(intent, "Select Picture"), TYPE_GALLERY);
2)方法二:打开相册,并且支持选择多张图片
(Android 5.0+才支持
),只需在上述代码基础上增加以下代码即可
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
4、跳转到系统相册,选择完图片之后,会回调回发起intent的那个activity的onActivityResult
方法,需要在这里获取对应的Uri
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//跟进请求方式区分
switch (requestCode) {
case TYPE_GALLERY:
if (resultCode == RESULT_OK) {
if (data != null) {
Uri uri = data.getData();
if (uri != null) {
//没设置Intent.EXTRA_ALLOW_MULTIPLE,会回调这个
onActivityCallBack(uri);
} else if (data.getClipData() != null) {
//设置Intent.EXTRA_ALLOW_MULTIPLE,会回调这个
ClipData clipData = data.getClipData();
int count = clipData.getItemCount();
if(count > 0){
Uri[] uris = new Uri[count];
for (int i=0; i<count; i++){
Uri imageUri =clipData.getItemAt(i).getUri();
uris[i] = imageUri;
}
onActivityCallBack(uris);
}else {
Toast.makeText(act, "获取数据为空", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(act, "获取数据为空", Toast.LENGTH_LONG).show();
}
}
} else {
//没有选择清除缓存
clearUpload();
}
break;
default:
break;
}
}
/**
* 回调到网页
* @param uri
*/
public void onActivityCallBack(Uri uri) {
if (uri == null) {
return;
}
//上传
if (this.getValueCallbackUris() != null) {
Uri[] uris = new Uri[]{uri};
this.getValueCallbackUris().onReceiveValue(uris);
this.setValueCallbackUris(null);
} else if (this.getValueCallbackUri() != null) {
this.getValueCallbackUri().onReceiveValue(uri);
this.setValueCallbackUri(null);
} else {
if (SswlLifecycleCallback.getCurActivity() != null) {
Toast.makeText(SswlLifecycleCallback.getCurActivity(), "无法读取图片", Toast.LENGTH_LONG).show();
}
}
}
/**
* 设置Intent.EXTRA_ALLOW_MULTIPLE,回调到网页
*
* @param uris
*/
public void onActivityCallBack(Uri[] uris) {
try {
if (uris == null) {
return;
}
//上传
if (this.getValueCallbackUris() != null) {
this.getValueCallbackUris().onReceiveValue(uris);
this.setValueCallbackUris(null);
} else if (this.getValueCallbackUri() != null) {
this.getValueCallbackUri().onReceiveValue(uris[0]);
this.setValueCallbackUri(null);
} else {
if (SswlLifecycleCallback.getCurActivity() != null) {
Toast.makeText(SswlLifecycleCallback.getCurActivity(), "无法读取图片", Toast.LENGTH_LONG).show();
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 清除上传缓存
*/
private void clearUpload() {
if (this.getValueCallbackUris() != null) {
this.getValueCallbackUris().onReceiveValue(null);
this.setValueCallbackUris(null);
} else if (this.getValueCallbackUri() != null) {
this.getValueCallbackUri().onReceiveValue(null);
this.setValueCallbackUri(null);
}
}