1. 程式人生 > >Android WebView Cookie的相關設定和自定義錯誤頁面載入

Android WebView Cookie的相關設定和自定義錯誤頁面載入

這個是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和本地的互動了:

跟著步奏走:

  1. 定義一個js介面:

    public interface CallBack {
        @JavascriptInterface
        void goBack();
    }
    
  2. 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");
    
  3. 在接口裡面不能直接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的相關設定都搞定了!!!