Webview中选择本地图片上传(二)

作者: monkey_who | 来源:发表于2017-08-11 16:54 被阅读446次

    小弟原创文章,转载请注明本文出处http://www.jianshu.com/p/62f3750f72a8

    前言(针对5.0以上选择图片之后闪退问题的修复)

    问题描述:上篇文章中(地址:http://www.jianshu.com/p/841bfa47b45c),因手上测试机有限,没有测到一些问题,在5.0以上的机型中,选择图片点确定之后闪退。

    这里对各种看众表示抱歉,特别是对那些点赞,或者用到我代码的读者,真的很抱歉!(我本意是帮助那些遇到同样问题的兄弟,不料反而坑了一把)

    正题

    在H5(js)页面中需要上传图片用的是input type=file的标签,当webview加载该页面,触发该标签时,会回调webView.setWebChromeClient(new WebChromeClient())中的onShowFileChooser方法(5.0之前都是openFileChooser方法)

    private ValueCallback<Uri[]> uploadMessageAboveL;
    // Android 5.0以上WebChromeClient中的隐藏方法
                @Override
                public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
                        WebChromeClient.FileChooserParams fileChooserParams ) {
                    
                  if (uploadMessageAboveL != null) {
                        uploadMessageAboveL.onReceiveValue(null);
                        uploadMessageAboveL = null;
                    }
                    uploadMessageAboveL = filePathCallback;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("image/*");
                    startActivityForResult(
                            Intent.createChooser(i, "Image Chooser"),
                            FILECHOOSER_RESULTCODE);
                    return true;
                }
    

    在当前页面在重写onActivityResult,来处理选择图片之后的回调

     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
                if (requestCode == FILECHOOSER_RESULTCODE) {
                    if (null == uploadMessageAboveL) return;
                    Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
                    if (uploadMessageAboveL != null) {
                        onActivityResultAboveL(requestCode, resultCode, data);
                    }
       
            }
    

    onActivityResultAboveL方法

      private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
            if (requestCode != FILECHOOSER_RESULTCODE || uploadMessageAboveL == null) {
                return;
            }
            Uri[] results = null;
            if (resultCode == Activity.RESULT_OK) {
                if (data == null) {
    
                } else {
                    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)};
                    }
                }
            }
            uploadMessageAboveL.onReceiveValue(results);
            uploadMessageAboveL = null;
            return;
        }
    

    这样就解决了上篇博文中的bug
    我用小米 max(6.01),小米6(7.0),华为荣耀4A(5.1),红米(6.01)测试过了,才敢放这段代码出来。

    原谅我不能把全部代码贴出来,因为是公司项目里的部分功能。若有需要,给我留言,我会整理一下将这部分代码发给你。

    相关文章

      网友评论

      • fed50a8c31bb:想学习一下,584770763@qq.com 谢谢楼主
      • da5f9afd4272:不用js和java可以实现不
        monkey_who:用第三方带浏览器内核的服务可以实现。我试过github上一些star比较多的webview的库,这些库兼容上也有很多问题,这些只是个自定义webview的控件。
      • 若邪:楼主你好,这个H5页面中选取本地相册图片,选择多张,各种版本适配吗,能看一下全部代码么
        若邪:@monkey_who 好的,谢谢
        monkey_who:@丿北纬91度灬 你好,这个没做选取多张,你可以试试第三方图片选择库,github上yanzhenjie的album
      • 6fd1d9051260:楼主,图片如何加载显示到网页上
        monkey_who:js跟Java互调,你传图片给网页,网页去显示。你去跟合作公司做H5的哥们商量一下,也就是一人多一个方法的事,应该会同意的
      • 6fd1d9051260:252019440@qq.com 哥能看到吗?我现在就是遇到这个问题,不知道如何解决,网页也不是我们公司人做的,希望大佬指教。
      • guanghui_d589:947170229@qq.com 谢谢楼主
        monkey_who:@guanghui_d589 在上班,待会发给你

      本文标题:Webview中选择本地图片上传(二)

      本文链接:https://www.haomeiwen.com/subject/xycrrxtx.html