關(guān)于WebView在KitKat版本沒有openFileChooser的解決方法

android與js交互,h5調(diào)用本地圖庫,選擇圖片后把結(jié)果返回給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方法,而且不同版本,參數(shù)不同,5.0以后用的是onShowFileChooser方法。getImage()里面是打開相冊選擇圖片的方法,自行實現(xiàn)。

/**
     * 開啟圖片選擇器
     */
    public void getImage() {
        ImageConfig imageConfig
                = new ImageConfig.Builder(
                // GlideLoader 可用自己用的緩存庫
                new GlideLoader())
                // 如果在 4.4 以上,則修改狀態(tài)欄顏色 (默認黑色)
                .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()
                // 多選時的最大數(shù)量   (默認 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中獲取選擇結(jié)果,轉(zhuǎn)正bitmap壓縮后轉(zhuǎn)成Uri通過回調(diào)接口ValueCallback返回給h5,h5轉(zhuǎn)成base64后傳給服務(wù)器,大致就是這樣一個過程。

但是這里有一個天坑,在android 4.4.0 4.4.1 4.4.2版本中,Google的程序員大概抽風了,取消了openFileChooser這個方法,因此上面的代碼也就沒用了。

解決方法

  1. android提供方法給js調(diào)用,選擇圖片、上傳圖片在android本地完成。
    因為一些原因,我不能用第一種方法解決,于是google百度了半天,終于找到了解決辦法。

  2. 不詳細寫了,看這里
    但是對于我這種懶人,是不屑用這種方法的( ̄_, ̄ )于是我又找了其他方案

  3. 用com.tencent.smtt.sdk.WebView代替原生的WebView
    TBS騰訊瀏覽服務(wù)
    騰訊的東西,總會遇到一些坑,看這里
    騰訊X5內(nèi)核啟用總結(jié)
    還有這里

大致就是這樣,懶人一個,就不多說了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容