Android Webview调用系统相册实现多选图片上传

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);
        }
    }

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值