关于WebView在KitKat版本没有openFileChooser的解决方法

android与js交互,h5调用本地图库,选择图片后把结果返回给h5:

webView.setWebChromeClient(new WebChromeClient() {

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

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

            // For Android >= 5.0
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                uploadMessageAboveL = filePathCallback;
//                openImageChooserActivity();
                getImage();
                return true;
            }
        });

如上说示,需要用到WebChromeClient的openFileChooser方法,而且不同版本,参数不同,5.0以后用的是onShowFileChooser方法。getImage()里面是打开相册选择图片的方法,自行实现。

/**
     * 开启图片选择器
     */
    public void getImage() {
        ImageConfig imageConfig
                = new ImageConfig.Builder(
                // GlideLoader 可用自己用的缓存库
                new GlideLoader())
                // 如果在 4.4 以上,则修改状态栏颜色 (默认黑色)
                .steepToolBarColor(getResources().getColor(R.color.main_green_light))
                // 标题的背景颜色 (默认黑色)
                .titleBgColor(getResources().getColor(R.color.main_green_light))
                // 提交按钮字体的颜色  (默认白色)
                .titleSubmitTextColor(getResources().getColor(R.color.white))
                // 标题颜色 (默认白色)
                .titleTextColor(getResources().getColor(R.color.white))
                // 开启单选选   (默认为多选)  (单选 为 singleSelect)
                .singleSelect()
//                        .mutiSelect()
//                .crop()
                // 多选时的最大数量   (默认 9 张)
//                        .mutiSelectMaxSize(9)
                // 已选择的图片路径
                .pathList(path)
                // 拍照后存放的图片路径(默认 /temp/picture)
                .filePath("/ImageSelector/Pictures")
                // 开启拍照功能 (默认开启)
                .showCamera()
                .requestCode(FILE_CHOOSER_RESULT_CODE)
                .build();

        ImageSelector.open(this, imageConfig);   // 开启图片选择器
    }

这里用的是一个第三方的图片选择器

@Override
    protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == FILE_CHOOSER_RESULT_CODE && resultCode == RESULT_OK && data != null) {
            Toast.makeText(WriteArticleActivity.this, "图片上传中···", Toast.LENGTH_LONG).show();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    List<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);
                    Bitmap bitmap = null;
                    for (String path : pathList) {
                        bitmap = compressImage(BitmapFactory.decodeFile(path));
                    }
                    Uri result = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null));
                    if (uploadMessageAboveL != null) {
                        Uri[] res = new Uri[]{result};
                        uploadMessageAboveL.onReceiveValue(res);
                        uploadMessageAboveL = null;
                    } else if (uploadMessage != null) {
                        uploadMessage.onReceiveValue(result);
                        uploadMessage = null;
                    }
                }
            }).start();
        } else if (requestCode == FILE_CHOOSER_RESULT_CODE && resultCode != RESULT_OK || data==null) {
            if (uploadMessageAboveL != null) {
                uploadMessageAboveL.onReceiveValue(null);
                uploadMessageAboveL = null;
            } else if (uploadMessage != null) {
                uploadMessage.onReceiveValue(null);
                uploadMessage = null;
            }
        }
    }

在onActivityResult中获取选择结果,转正bitmap压缩后转成Uri通过回调接口ValueCallback返回给h5,h5转成base64后传给服务器,大致就是这样一个过程。

但是这里有一个天坑,在android 4.4.0 4.4.1 4.4.2版本中,Google的程序员大概抽风了,取消了openFileChooser这个方法,因此上面的代码也就没用了。

解决方法

  1. android提供方法给js调用,选择图片、上传图片在android本地完成。
    因为一些原因,我不能用第一种方法解决,于是google百度了半天,终于找到了解决办法。

  2. 不详细写了,看这里
    但是对于我这种懒人,是不屑用这种方法的( ̄_, ̄ )于是我又找了其他方案

  3. 用com.tencent.smtt.sdk.WebView代替原生的WebView
    TBS腾讯浏览服务
    腾讯的东西,总会遇到一些坑,看这里
    腾讯X5内核启用总结
    还有这里

大致就是这样,懒人一个,就不多说了

推荐阅读更多精彩内容