1. 程式人生 > >android webview 運用小結(選取圖片,js呼叫,混淆保留,cookie問題,高低版本問題)

android webview 運用小結(選取圖片,js呼叫,混淆保留,cookie問題,高低版本問題)

由於專案需求,對webview要進行大量運用,所以對webview進行了一番學習與研究。廢話不多說,直接按流程進行。

首先,關於webview的基本的內容,簡單描述一下,作為記錄。

    1、關於返回上個頁面:重寫一下 onKeyDown() 或者 onKeyUp() ,處理 keyCode == KeyEvent.KEYCODE_BACK 的情況,判斷一下 webview.canGoBack(),根據需要處理即可。

    2、關於  setWebViewClient()  和  setWebChromeClient() 的運用。

         WebViewClient主要幫助WebView處理各種通知和事件,可以根據提供的一些方法載入我們需要的展示以及錯誤時的處理。常用到的方法:onPageStart(),onPageFinish(),onReceiveError(),shouldOverrideUrlLoading()等。

         WebChromeClient主要幫助WebView處理Javascript的對話方塊、網站圖示、當前頁面的title、載入進度等。常用的方法:onReceivedTitle,onJsAlert(WebView view, String url, String message, JsResult result)  /** 覆蓋預設的window.alert展示介面,避免title裡顯示為“:來自file:////”  */ ,  onJsConfirm(),    onJsPrompt()    onProgressChanged()等,都是重寫的,引數沒加。

其他,說一些用到的新東西(對我來說是新的)。

第一,webview通過特定的url載入本地內容,包括與第三方瀏覽器合作的一些功能,(之前合作用到,記錄一下),下面是希望的效果:

實現,根據自定義協議,比如:test://abc,然後通過shouldOverrideUrlLoading()攔截處理即可。比如自定義的:test://gotosearch?input=123,可以載入本地的搜尋功能,並把使用者在html裡輸入的內容 123 帶過來。

第二,關於載入本地圖片的問題,這個問題讓我糾結了好久,下面簡單描述下。

webview載入本地圖片功能,網上搜索有很多,不過說的都差不多,都是WebChromeClient 下的 openFileChooser(),針對不同的版本重構了幾個出來而已。但是經過我反覆的測試和網上資料的查閱,發現在4.4以後,這個方法不能被使用了,(也可能是我沒找到,如果有遇到的可以給我留言,感激),後來進過一段時間的研究,只能採用了先通過js呼叫選擇圖片功能,然後上傳圖片的方法實現期望的功能。這個涉及到一個js呼叫的細節問題,也是困擾了我們好長時間,在js呼叫選取圖片的時候,剛開始都成功了,沒什麼問題,後來伺服器的兄弟改了一下js方法(這個是後來發現的,原來就是方法名的問題),導致js呼叫無效。後來反覆的撤銷更改,發現是伺服器的js裡,呼叫的方法名必須是onClick()。這樣的事情真的讓人惱火。=至於java呼叫html,就很簡單了。

第三,關於cookie的問題。由於我們涉及到賬號的切換,在伺服器的同事清除了cookie後,但是app上依然保留,經過查詢相關資料,記錄一下cookie清除的方法。

            @SuppressWarnings("unused")
            CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(this);
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.removeAllCookie();

經過我的測試,好像需要webview destroy()一下才能起作用,暫時沒有比較好的處理,能解決問題,但是不夠完美,回頭要在研究下。(希望對此有研究的朋友可以說一下)。

第四,關於混淆的問題。

當這一切都搞定了,我們準備上線的時候,發現又不能用了,瞬間有種瘋掉的感覺。通過檢視日誌,發現不能呼叫的原因很簡單,找不到對應的方法,那肯定是混淆的問題了,關於混淆,這個不贅述,隨便查一下就一大堆。我這裡只作為我用到的記錄一下。

-keep class com.yourpackagename.WebActivity$*{*;}

至此,基本問題都搞定,可以上線了。

( 此篇文章只作為個人總結,裡面如果有不對的地方,還請各位大神指正,感激不盡 )