解決WebView文件上傳無法重復(fù)選擇問題

作者簡介 原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog

又到了周五啦,提前祝大家周末愉快!

本篇來自釗林的投稿,分享了一個解決WebView文件上傳無法重復(fù)選擇問題的方案,希望能夠幫助到大家。

釗林的博客地址:

http://teachcourse.cn

正文

Android?開發(fā)使用WebView控件加載包含表單的 H5 網(wǎng)頁,點擊上傳文件按鈕,彈出對話框,選擇從相冊獲取照片、拍照或打開手機文件管理器,從 Android 手機選取一張圖片或一個文件,然后通過ValueCallback接口傳遞,在 WebView 加載的 H5網(wǎng)頁 顯示。

這里有一個問題,點擊“取消”或返回按鈕,無法重復(fù)回調(diào)onShowFileChooseropenFileChooser方法,控制臺打印:

Attempted to finish an input event but the input event receiver has already been disposed

一、深入理解onShowFileChooser或openFileChooser

WebChromeClient各個方法這里不再贅述,特殊說明關(guān)于 WebChromeClient,它既不是接口也不是抽象類,但聲明的方法很多方法體都是空的,這是讓釗林感到疑惑之一。查看 WebView 源碼,setWebChromeClient()傳入WebChromeClient對象,然后使用傳入的對象,調(diào)用 WebChromeClient 聲明的方法,再將一些參數(shù)傳遞返回 WebChromeClient 空方法體。在 WebView 源碼里面代碼也很簡單,詳細(xì)的處理處理邏輯看不到,這是讓釗林感到疑惑之二,感覺像一個黑箱子。

然后就一直想,那么重寫 WebChromeClient 的方法有什么作用呢?先看一下onShowFileChooser,如下:

該方法的作用,告訴當(dāng)前APP,打開一個文件選擇器,比如:打開相冊、啟動拍照或打開本地文件管理器,實際上更好的理解,WebView加載包含上傳文件的表單按鈕,HTML 定義了 input 標(biāo)簽,同時 input 的 type 類型為 file,手指點擊該按鈕,回調(diào)onShowFileChooser這個方法,在這個重寫的方法里面打開相冊、啟動照片或打開本地文件管理器,甚至做其他任何的邏輯處理,點擊一次回調(diào)一次的前提是請求被取消,而取消該請求回調(diào)的方法:給ValueCallback接口的onReceiveValue抽象方法傳入null,同時 onShowFileChooser 方法返回true

ValueCallback的抽象方法被回調(diào)onShowFileChooser方法返回true;反之返回false;再來看一下 openFileChooser 的源碼,如下:

在所有發(fā)布的SDK版本中,openFileChooser是一個隱藏的方法,使用onShowFileChooser代替,但是最好同時重寫showFileChooseropenFileChooser方法,Android 4.4.X以上的系統(tǒng)回調(diào)onShowFileChooser方法,低于或等于 Android 4.4.X的系統(tǒng)回調(diào)openFileChooser方法,只重寫onShowFileChooseropenFileChooser造成在有的系統(tǒng)可以正常回調(diào),在有的系統(tǒng)點擊沒有反應(yīng)。

仔細(xì)分析onShowFileChooseropenFileChooser回調(diào)方法,這兩個方法之間的區(qū)別:

第一個區(qū)別:前者ValueCallback接口回傳一個Uri數(shù)組,后者回傳一個Uri對象,在onActivityResult回調(diào)方法中調(diào)用ValueCallback接口方法onReceiveValue傳入?yún)?shù)特別注意。

第二個區(qū)別:前者 將 后者的 acceptType、capture 封裝成 FileChooserParams 抽象類

二、實例展示onShowFileChooser或openFileChooser處理過程

這是實例運行的效果圖,H5表單寫入兩個上傳文件的按鈕,點擊其中一個從底部彈出對話框,選擇相冊文件或拍照,點擊“取消”按鈕,再次點擊“上傳文件”按鈕能夠再次回調(diào)onShowFileChooseropenFileChooser方法。

在之前的理解中,誤解onShowFileChooseropenFileChooser只能打開相冊或啟動相機拍照,其實不僅僅是這樣,onShowFileChooseropenFileChooser既然是一個回調(diào)的方法,可以重復(fù)執(zhí)行各種邏輯代碼,比如:啟動另一個Activity、彈窗對話框、錄制視頻或錄音等

在上面的例子中,執(zhí)行彈窗操作,將彈窗的處理代碼放置onShowFileChooseropenFileChooser方法體,如下:

點擊彈窗取消按鈕、點擊打開相冊取消操作取消拍照,可能無法再次回調(diào)onShowFileChooseropenFileChooser方法,如果你沒有在點擊彈窗取消方法中或onActivityResult回調(diào)方法resultCode==RESULT_CANCELED處理,再次點擊上傳按鈕,打印出 log:

Attempted to finish an input event but the input event receiver has already been disposed

同時,點擊沒有效果。解決方案:

在不期待回調(diào) mFilePathCallback 的 onReceiveValue 方法時,調(diào)用?cancelFilePathCallback(),解決點擊上傳按鈕無法重復(fù)回調(diào)的問題。


完。。。。。。。。。。。。。。。。。。。。。

文章原創(chuàng)作者GuoLin 書籍推薦

郭林大神原創(chuàng)android 書籍:《第一行代碼 android》

淘寶鏈接: https://s.click.taobao.com/t?e=m%3D2%26s%3DgKUfuKdAZKocQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67p2n%2BQBNMyE6Rku8%2Bpj6eJall3bs%2B3NRhNHnsKI%2BqxhyM0iVZhTFBom4YIorMPnmg8G0g2OJi%2FzmXHfenomYtn5EW9vzeG8LzfPUwktUBEmkxg5p7bh%2BFbQ%3D&pvid=10_106.6.161.154_3367_1490163222155

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內(nèi)容

  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    南城的人閱讀 4,774評論 0 19
  • Tips 由于WebView的用法實在太多,如果您只是想查詢某個功能的使用——建議Ctrl+F(Commad+F)...
    BugDev閱讀 7,766評論 11 109
  • WebView常用方法 String getUrl():獲取當(dāng)前頁面的URL。 reload():重新reload...
    JuSong閱讀 3,334評論 0 3
  • WebView·開車指南 2016-08-31BugDev 北京市東城區(qū)首席Bug布道師開山之作,一整月交通事故血...
    53c021c38a1d閱讀 847評論 0 1
  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    小莊bb閱讀 3,536評論 3 25