Android WebView Cookie的相關設定和自定義錯誤頁面載入
阿新 • • 發佈:2019-02-04
這個是WebView
的後篇吧,一拖又不知道拖了多久了,言歸正傳,上一次大概翻譯了一些WebView的官方介紹,然後剩下了WebView
的Cookie相關另外就是載入頁面錯誤那個醜醜的頁面的處理。
內容簡介:
WebView Cookie的相關使用!
錯誤頁面的處理
華麗的分割線
Cookie
在請求介面的時候往往需要有要求,就是需要你帶上使用者的Token
,id
…等等的東西。
啦啦啦,直接看一個方法吧:
@SuppressLint("NewApi") private void setCookie(String url) { URI uri = URI.create(url); if (TextUtils.isEmpty(uri.getHost())) { return; } if (!Build.VERSION.SDK_INT >= 21) { CookieSyncManager.createInstance(mContext); } CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie(); // 注入cookies List<String> cookies = getCookies(); for (String cookie : cookies) { cookieManager.setCookie(uri.getHost(), cookie); } if (Build.VERSION.SDK_INT >= 21) { cookieManager.flush(); } else { CookieSyncManager.getInstance().sync(); } }
你沒有看錯,就是醬紫的!!通過CookieManager
得到相關的管理器。然後乎乎地往裡面加就是了!
新增Cookie一定要記得先對Url進行判斷,你請求自己的介面固然需要帶上自己的cookie,但是要是你請求第三方的支付等等的介面,然後你又盲目的攜帶上別人沒有指定的cookie,或者覆蓋了別人的cookie,那麼就呵呵噠了!(我在這裡就被坑過,一請求網頁就過期,後來才知道在loadUrl()這個方法時,都強加了cookie的!!)
然後就是錯誤頁面的處理了,實現也比較簡單,那就是在網頁載入錯誤時候指定一個本地的頁面載入,另外在載入的時候首先判斷一下當前的網路狀態是否可用。
WebViewClient webViewClient = new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mSlidWebViewLayout.setTopMsg(view.getTitle()); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error); } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.e("onReceivedError", "onReceivedError = " + errorCode); //404 : error code for Page Not found if (errorCode == 404) { // show Alert here for Page Not found view.loadUrl("file:///android_asset/html/404.html"); Log.e("404", failingUrl); } else { view.loadUrl("file:///android_asset/html/nowifi.html"); Log.e("error", failingUrl); } } @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { super.onReceivedHttpError(view, request, errorResponse); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { mTopSlidWebView.loadUrl(url); return true; } @Override public void onPageStarted(final WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); mPb.setVisibility(View.VISIBLE); } }; mTopSlidWebView.setWebChromeClient(webChromeClient);
然後在loadUrl執行之前,可以做一些處理了:
@Override public void loadUrl(String url) { //記錄之前的一個url if (mUrl == null || !mUrl.equals(url)) { mUrl = url; } //url是需要新增cookie的 if (url.startsWith("xxxx")) { setCookie(url); } //網路是否可用 mNetworkInfo = connectionManager.getActiveNetworkInfo(); super.loadUrl(mNetworkInfo == null ? "file:///android_asset/html/nowifi.html" : url); }
最後最後:那麼跳轉為本地assets裡的html之後,又怎麼讓使用者點選重新載入呢?這裡就又要用到之前說的js和本地的互動了:
跟著步奏走:
定義一個js介面:
public interface CallBack { @JavascriptInterface void goBack(); }
WebView
新增介面://設定js可用 別忘記了 settings.setJavaScriptEnabled(true); //新增介面,第二個引數要和html裡面的那個window.xxx.goback()保持一致,對應的物件嘛!! addJavascriptInterface(new CallBack() { @JavascriptInterface public void goBack() { // reload(); mHandler.sendEmptyMessage(RELOAD); Toast.makeText(getContext(), "call back", Toast.LENGTH_SHORT).show(); } }, "android");
在接口裡面不能直接reload(),或者loadUrl(),那麼就handler一下吧!
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == RELOAD) { loadUrl(mUrl); Log.e("reloadurl", mUrl); } super.handleMessage(msg); } };
至此,錯誤頁面和Cookie的相關設定都搞定了!!!