Andorid使用webview上傳文件的一個(gè)坑

由于項(xiàng)目需求,需要在一個(gè)h5頁面上實(shí)現(xiàn)圖片上傳的功能。實(shí)現(xiàn)的過程是,當(dāng)用戶點(diǎn)擊<input type="file">時(shí),webview會監(jiān)聽到這個(gè)事件接著在android原生這部分獲取選中圖片并將路徑傳回給h5頁面處理并上傳。監(jiān)聽這個(gè)選擇圖片的監(jiān)聽是需要去繼承一個(gè)WebChromeClient并重寫它里面的方法,因?yàn)橛捎诟鱾€(gè)系統(tǒng)版本webview的差異是需要重寫多個(gè)方法才能適配不同的系統(tǒng)版本的手機(jī),代碼如下:

    private class MyWebClient extends WebChromeClient {
        // For Android 5.0+
        //接受一個(gè)uris[]
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> valueCallback , FileChooserParams fileChooserParams) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--5.0+");
            mValueCallback = valueCallback;
            goToPhotos();
            return true;
        }

        // For Android 3.0+
        //只能單獨(dú)傳一個(gè)uri
        public void openFileChooser(ValueCallback uploadMsg) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0+");
            mValueCallbackSingle = uploadMsg;
            goToPhotos();
        }

        //3.0--版本
        public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0");
            openFileChooser(uploadMsg);
        }

        // For Android 4.1
        public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--4.1");
            openFileChooser(uploadMsg);
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "newProgress--newProgress--"+newProgress);
            super.onProgressChanged(view, newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "onReceivedTitle--title--" + title);
            super.onReceivedTitle(view, title);
        }
    }

從代碼中開出每次監(jiān)聽都會返回一個(gè)valueCallback對象,而這個(gè)對象是負(fù)責(zé)將我們獲取到的圖片路徑傳給h5頁面 。

 mValueCallback.onReceiveValue(uris);

但是這里有個(gè)問題需要注意的是如果打一次觸發(fā)了監(jiān)聽返回mValueCallback沒有調(diào)用onReceiveValue方法,下一次點(diǎn)擊時(shí)<input type = file>就不會再次觸發(fā)監(jiān)聽了,所以會造成無論怎么點(diǎn)都沒有反應(yīng)這種情況,為了解決這個(gè)問題需要在沒有選中圖片路徑的情況下mValueCallback.onReceiveValue(null)傳一個(gè)空值,這樣就不會在出現(xiàn)沒有選中圖片后,下次點(diǎn)擊沒有反應(yīng)的情況了。最后 webview的坑很多,開發(fā)的時(shí)候要多加注意。

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評論 25 708
  • 女媧確實(shí)是適合思考第二類問題的。 女媧從河邊取來黏土,捧在手里,照著自己的倒影,漸漸捏出人形。 這人形眉清目秀,樣...
    妳七舅閱讀 1,421評論 0 0
  • 轉(zhuǎn)載請注明出處Apple原文地址: https://developer.apple.com/documentati...
    小羊快跑閱讀 506評論 2 0
  • 暑假開始很久了,可能對于我們來說不是。但也不能按時(shí)間來算,日子這樣過就太沒有意義了。 又開啟了我日夜顛倒的模...
    571facb6f2df閱讀 261評論 0 2
  • 距離2017年還有14天的2016年12月17日在吉林市朝陽大廈四樓送給自己一份特別的新年禮物! 禮物源于佳穎老師...
    學(xué)霸教練李斌閱讀 397評論 0 0

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