1. 程式人生 > >Android WebView 內處理302重定向

Android WebView 內處理302重定向

解決webView 無法載入帶有重定向的URL程式碼:

public class NewsDetailActivity extends AppCompatActivity{
    private WebViewWithProgress myWebViewWithProgress;
    private WebView myWebView;
    private String newsDetailURL;

    /**
     * 記錄URL的棧
     * 規則:
     * 1.不可在{@code WebView.onPageFinished();}中開始記錄URL
     * 2.記錄需要遮蔽重定向URL
     * */
private final Stack<String> mUrls=new Stack<>(); /** * 判斷頁面是否載入完成 * */ private boolean mIsloading=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news_detail); if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明狀態列 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明導航欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar); setSupportActionBar(toolbar); // Show the Up button in the action bar.
ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } // 查詢瀏覽器控制元件ID myWebViewWithProgress = (WebViewWithProgress) findViewById(R.id.MyWebViewContent); //獲取瀏覽器 myWebView = myWebViewWithProgress.getWebView(); // 設定頁面支援JavaScript myWebView.getSettings().setJavaScriptEnabled(true); //縮放開關 //設定此屬性,僅支援雙擊縮放,不支援觸控縮放(android4.0) myWebView.getSettings().setSupportZoom(true); // 設定是否可縮放 myWebView.getSettings().setBuiltInZoomControls(true); //將圖片調整到適合WebView的大小 myWebView.getSettings().setUseWideViewPort(true); myWebView.getSettings().setDomStorageEnabled(true); myWebView.getSettings().setUseWideViewPort(true); myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); //設定圖片自動載入 myWebView.getSettings().setLoadsImagesAutomatically(true); newsDetailURL = getIntent().getStringExtra("newsDetailURL"); // 設定WebView監聽事件 myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub return false; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if(mIsloading &&mUrls.size()>0) { mUrls.pop(); } recordUrl(url); super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Log.v("FairyDebug", "URL載入完畢" + url); super.onPageFinished(view, url); if(mIsloading|| url.startsWith("about:")) { mIsloading=false; } } }); Log.v("FairyDebug","--------get---------------"+newsDetailURL); // 載入URL myWebView.loadUrl(newsDetailURL); } /** * 記錄非重定向連結 避免重新整理頁面造成的重複入棧*/ private void recordUrl(String url) { //這裡還可以根據自身業務來遮蔽一些連結放入URL棧 if(!TextUtils.isEmpty(url)&& !url.equalsIgnoreCase(getLastPageUrl())){ mUrls.push(url); } } /**獲取上一頁的連結*/ private synchronized String getLastPageUrl(){ return mUrls.size()>0 ? mUrls.peek():null; } /**推出上一頁連結*/ public String popLastPageUrl(){ if(mUrls.size()>=2) { mUrls.pop();// pop current page url return mUrls.pop(); } return null; } }

相關知識點筆記:
若沒有設定 WebViewClient 則在點選連結之後由系統處理該 url,通常是使用瀏覽器開啟或彈出瀏覽器選擇對話方塊。
若設定 WebViewClient 且該方法返回 true ,則說明由應用的程式碼處理該 url,WebView 不處理。
若設定 WebViewClient 且該方法返回 false,則說明由 WebView 處理該 url,即用 WebView 載入該 url。