使用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>