Android webView 不支持文件上传的问题

//1、webView 重写WebChromeClient 

private ValueCallback<Uri> mUploadMessage;
private ValueCallback<Uri[]> mUploadCallbackAboveL;
private static final int FILE_CHOOSER_RESULT_CODE = 10100;

private WebChromeClient getWebChromeClient = new WebChromeClient() {

    // For Android < 3.0
    public void openFileChooser(ValueCallback<Uri> valueCallback) {
        mUploadMessage = valueCallback;
        openImageChooserActivity();
    }

    // For Android  >= 3.0
    public void openFileChooser(ValueCallback valueCallback, String acceptType) {
        mUploadMessage = valueCallback;
        openImageChooserActivity();
    }

    //For Android  >= 4.1
    public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
        mUploadMessage = valueCallback;
        openImageChooserActivity();
    }

    // For Android >= 5.0
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
        //fileChooserParams.getAcceptTypes() 这个数组中存在一个打开的资源类型,(video、image)
        mUploadCallbackAboveL = filePathCallback;
        openImageChooserActivity();
        return true;
    }
};


// 2.这里如果原来的方法是只能跳转获取资源文件,因为我的需求是相册相机都需要,所以自己调用选择库实现
private void openImageChooserActivity() {
//Intent i = new Intent(Intent.ACTION_GET_CONTENT);
//i.addCategory(Intent.CATEGORY_OPENABLE);
//i.setType("image/*");
//startActivityForResult(Intent.createChooser(i, "Image Chooser"), //FILECHOOSER_RESULTCODE);

   Matisse.from(H5Fragment.this)
        .choose(MimeType.ofImage())
        .countable(true)
        .capture(true)
        .captureStrategy(new CaptureStrategy(true, getActivity().getPackageName() + ".ui.MyFileProvider"))
        .maxSelectable(1)
        .showSingleMediaType(true)
        .imageEngine(new Glide4Engine())
        .forResult(FILE_CHOOSER_RESULT_CODE);
}

// 3.选择图片后处理
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
     if (data == null) {
            //这两行是为了处理 没有选择资源文件时, 复位操作,处理没有选择返回时 第二次点击就失效的问题
            mUploadCallbackAboveL.onReceiveValue(null);
            mUploadCallbackAboveL = null;
            return;
     }

    if (requestCode == FILE_CHOOSER_RESULT_CODE) {
        if (null == mUploadMessage && null == mUploadCallbackAboveL) return;
        List<Uri> pathList = Matisse.obtainResult(data);
        if (mUploadCallbackAboveL != null) {
            onActivityResultAboveL(requestCode, resultCode, data);
        } else if (mUploadMessage != null) {
            if (pathList.size() > 0) {
                Uri result = pathList.get(0);
                mUploadMessage.onReceiveValue(result);
            }
            mUploadMessage = null;
        }
    }
}

// 4. 选择内容回调到Html页面
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
    if (requestCode != FILE_CHOOSER_RESULT_CODE || mUploadCallbackAboveL == null)
        return;

    List<Uri> pathList = Matisse.obtainResult(intent);
    if (pathList.size() > 0) {
        Uri[] results = new Uri[1];
        results[0] = pathList.get(0);
        mUploadCallbackAboveL.onReceiveValue(results);
    }
    mUploadCallbackAboveL = null;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值