Android Webview调用系统相册实现多选图片上传
16lz
2021-01-23
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页面设置的,就会调用到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); } }
更多相关文章
- android网络图片的下载
- Android声音播放实例代码
- 2013.12.23 (2)——— android 代码调用shell
- Android判断横屏竖屏代码
- 代码中如何设置TextView为不可见
- android 开启本地相册选择图片并返回显示
- android截屏代码:C++实现
- Android 异步任务加载图片代码