Android WebView基本使用和獲取Cookie

使用WebView獲取Cookie是一個(gè)很簡(jiǎn)單方便的方法,但是需要占用一些內(nèi)存資源。在使用時(shí)應(yīng)當(dāng)注意防止內(nèi)存泄漏,主要注意WebView的場(chǎng)景和對(duì)應(yīng)的上下文。

WebView示例代碼:

package com.lzy.webviewdemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

import org.apache.commons.io.FileUtils;

import java.io.File;

public class MainActivity extends Activity {
    private final static String TAG = "MainActivity";

    //WebView相關(guān)配置
    private final static String HOST_URL = "https://itorrents.org";
    private final static String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36";
    private final static String CF_CLEARENCE = "cf_clearance";

    //磁力鏈接
    private final static String HTTP_TEST = "https://itorrents.org/torrent/B415C913643E5FF49FE37D304BBB5E6E11AD5101.torrent";

    private WebView webView;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.main_txt);
        textView.setText("你看不見(jiàn)我");
        initWebView();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        webView.removeAllViews();
        webView.destroy();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if(webView != null && webView.canGoBack()){
                // goBack()表示返回WebView的上一頁(yè)面
                webView.goBack();
                return true;
            }
        }
        //結(jié)束當(dāng)前頁(yè)
        return super.onKeyDown(keyCode, event);
    }

    public void initWebView(){
        //xml加載
        //webView = findViewById(R.id.main_web_view);

        //推薦動(dòng)態(tài)加載
        webView = new WebView(MainActivity.this);
        webView.setLayoutParams(new ViewGroup.LayoutParams(0, 0));
        webView.setVisibility(View.INVISIBLE);

        //基本設(shè)置
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//設(shè)置js可以直接打開窗口,如window.open(),默認(rèn)為false
        webSettings.setJavaScriptEnabled(true);//是否允許執(zhí)行js,默認(rèn)為false。設(shè)置true時(shí),會(huì)提醒可能造成XSS漏洞
        webSettings.setSupportZoom(true);//是否可以縮放,默認(rèn)true
        webSettings.setBuiltInZoomControls(true);
        webSettings.setAppCacheEnabled(true);//是否使用緩存
        webSettings.setDomStorageEnabled(true);//DOM Storage
        webSettings.setUserAgentString(USER_AGENT);//設(shè)置用戶代理

        //網(wǎng)頁(yè)自適應(yīng)
        webSettings.setUseWideViewPort(true);//將圖片調(diào)整到適合webView的大小
        webSettings.setLoadWithOverviewMode(true);//縮放至屏幕大小

        webView.setWebChromeClient(new WebChromeClient());
        webView.setWebViewClient(new NewWebViewClient());

        //加載網(wǎng)頁(yè)
        webView.loadUrl(HOST_URL);
    }

    class NewWebViewClient extends WebViewClient{
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            //添加Cookie獲取操作
            CookieManager cookieManager = CookieManager.getInstance();
            final String cookieStr = cookieManager.getCookie(url);
            Log.e(TAG, "Fetch Cookie: " + cookieStr);
            if(cookieStr.contains(CF_CLEARENCE)){
                textView.setText("Cookie已經(jīng)獲取到");
                Thread workThread = new Thread(){
                    @Override
                    public void run() {
                        //Todo: 持久化Cookie到本地
                        ...
                    }
                };
                workThread.start();
            }
            super.onPageFinished(view, url);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            //返回值是true的時(shí)候WebView打開,為false則系統(tǒng)瀏覽器或第三方瀏覽器打開。
            //如果要下載頁(yè)面中的游戲或者繼續(xù)點(diǎn)擊網(wǎng)頁(yè)中的鏈接進(jìn)入下一個(gè)網(wǎng)頁(yè)的話,重寫此方法下,不然就會(huì)跳到手機(jī)自帶的瀏覽器了,而不繼續(xù)在你這個(gè)webview里面展現(xiàn)了
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }

    }
}

XML文件中設(shè)置如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <!-- 若動(dòng)態(tài)加載則不要在xml中定義 --> 
    <!-- 
    <WebView
        android:id="@+id/main_web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        >
    </WebView>
    -->

    <TextView
        android:id="@+id/main_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        />

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

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

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