Android WebView 上传图片(以5.0为分界点)不同的处理方式

近期由于项目需求,需要使用WebView进行图片的上传工作,按照之前在Eclipse中写好的代码直接拿到Android Studio中进行使用发现在android 5.0以上上传图片不能展示出来(在eclipse中是没问题的)查阅资料发现是由于5.0(API21)对WebView的方法进行了更新,具体是WebView的setWebChromeClient方法中对文件的操作由之前的openFileChooser(ValueCallBack<Uri> uploadMsg)变成了5.0之后的onShowFileChooser(WebView webview,ValueCallBack<Uri[ ]> filePathCallBack, FileChooserParams fileChooserParams)导致了回调方法发生了改变,所以需要以5.0为分界点对此回调做不同的处理。


具体如下:


webview.setWebChromeClient(new WebChromeClient() {
    @SuppressWarnings("unused")
    public void openFileChooser(ValueCallback<Uri> uploadMsg) {

        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        RepairActivity.this.startActivityForResult(
                Intent.createChooser(i, "File Chooser"),
                FILECHOOSER_RESULTCODE);

    }

    // For Android 3.0+
    @SuppressWarnings("unused")
    public void openFileChooser(ValueCallback<Uri> uploadMsg,
                                String acceptType) {
        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("*/*");
        RepairActivity.this.startActivityForResult(
                Intent.createChooser(i, "File Browser"),
                FILECHOOSER_RESULTCODE);
    }

    // For Android 4.1
    @SuppressWarnings("unused")
    public void openFileChooser(ValueCallback<Uri> uploadMsg,
                                String acceptType, String capture) {
        mUploadMessage = uploadMsg;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        RepairActivity.this.startActivityForResult(
                Intent.createChooser(i, "File Chooser"),
                RepairActivity.FILECHOOSER_RESULTCODE);
    }

    @SuppressWarnings("unused")
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        mUploadMsgForAndroid5 = filePathCallback;
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        RepairActivity.this.startActivityForResult(
                Intent.createChooser(i, "File Chooser"),
                RepairActivity.FILECHOOSER_RESULTCODE);
        return true;
    }
});


这是对WebView做文件选择的操作,涉及到的几个方法分别是android 3.0以下,3.0以上4.0以下,4.0以上5.0以下和5.0以上,当然在回调中不需要分的这么详细,只需要将5.0之前和之后进行区分就好。。。下面贴出对回调的处理,


代码示例如下::

//    @SuppressWarnings("unchecked")
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@SuppressWarnings("unchecked")
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == FILECHOOSER_RESULTCODE) {
        if (null == mUploadMessage && null == mUploadMsgForAndroid5){
            return;
        }
        Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
        if (mUploadMsgForAndroid5 != null) {
            onActivityResultAboveL(requestCode, resultCode, intent);
        } else if (mUploadMessage != null) {
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }

    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
    if (requestCode != FILECHOOSER_RESULTCODE || mUploadMsgForAndroid5 == null)
        return;
    Uri[] results = null;
    if (resultCode == Activity.RESULT_OK) {
        if (data != null) {
            String dataString = data.getDataString();
            ClipData clipData = data.getClipData();
            if (clipData != null) {
                results = new Uri[clipData.getItemCount()];
                for (int i = 0; i < clipData.getItemCount(); i++) {
                    ClipData.Item item = clipData.getItemAt(i);
                    results[i] = item.getUri();
                }
            }
            if (dataString != null)
                results = new Uri[]{Uri.parse(dataString)};
        }
    }
    mUploadMsgForAndroid5.onReceiveValue(results);
    mUploadMsgForAndroid5 = null;
}

之前在看网上的代码的时候可能会因为以下变量的问题不知道怎么写导致一些bug(可能是因为我比较渣吧)现在我把涉及到的变量贴出::

private ValueCallback mUploadMessage;
private ValueCallback<Uri[]> mUploadMsgForAndroid5;

这两个只是对回调做区分的变量


private final static int FILECHOOSER_RESULTCODE = 1;

这是对跳转相册的标识处理。。。


好了,到此android 5.0以上webView不能上传图片的问题已经解决(亲测有效),虽然我很渣但是我一直在努力,希望大家有更好的方法分享出来,我们一起进步。。。


好了好了,时间太晚了必须要睡了,祝大家和自己晚安哦吐舌头!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值