WebView支持打開外部App / WebView監聽下載鏈接調起下載等

--記錄webview的簡單使用--

 

要使用Webview的全部功能需要一下設置:

WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);                       //可執行js
        webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);   //設置頁面默認縮放密度
        webSettings.setDefaultTextEncodingName("UTF-8");              //設置默認的文本編碼名稱,以便在解碼html頁面時使用
        webSettings.setAllowContentAccess(true);                      //啓動或禁用WebView內的內容URL訪問
        webSettings.setAppCacheEnabled(false);                        //設置是否應該啓用應用程序緩存api
        webSettings.setBuiltInZoomControls(false);                    //設置WebView是否應該使用其內置的縮放機制
        webSettings.setUseWideViewPort(true);                         //設置WebView是否應該支持viewport
        webSettings.setLoadWithOverviewMode(true);                    //不管WebView是否在概述模式中載入頁面,將內容放大適合屏幕寬度
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);          //重寫緩存的使用方式
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);   //告知js自動打開窗口
        webSettings.setLoadsImagesAutomatically(true);                //設置WebView是否應該載入圖像資源
        webSettings.setAllowFileAccess(true);                         //啓用或禁用WebView內的文件訪問
        webSettings.setDomStorageEnabled(true);  

 

1.打開外部APP  一般外部app打開都是使用deeplink的形式 ,有個特殊的Scheme,因此我們特殊處理非http/https開頭的鏈接即可:

mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (!(url.startsWith("http") || url.startsWith("https"))) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                }
                view.loadUrl(url);
                return true;
            }
        });

 

2.獲取網頁標題

 mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                if (!TextUtils.isEmpty(title))
                mTitleTv.setText(title);
            }
        });

3.監聽點擊的鏈接是不是下載,包括302跳轉下載類型

    mWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                LogUtils.log("啓動下載:" + mUrl);
               
                LogUtils.log("has download:"+url);
                    
                //做下載邏輯

            }
        });

 

4.返回網頁級而不是退出頁面

 //點擊回退按鈕不是退出應用程序,而是返回上一個頁面
    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
        }else {
            super.onBackPressed();
        }
    }

-------------完整代碼

package com.xmiles.hytechad.activity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

import com.xmiles.hytechad.R;
import com.xmiles.hytechad.utils.DownloadUtils;
import com.xmiles.hytechad.utils.LogUtils;

public class WebViewActivity extends AppCompatActivity {

    public static final String KEY_URL="url";
    public static final String KEY_DOWNLOAD_NAME="download_name";
    public static final String KEY_S_DOWNLOAD="start_download";
    public static final String KEY_E_DOWNLOAD="end_download";
    public static final String KEY_S_INSTALL="start_install";
    public static final String KEY_E_INSTALL="end_install";
    private TextView mTitleTv;
    private WebView mWebView;
    private String mUrl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hy_ad_web_view);
        mUrl = getIntent().getStringExtra("url");
        if (mUrl==null){
            finish();
            return;
        }
        
        mTitleTv=findViewById(R.id.title);
        mWebView=findViewById(R.id.webView);
        findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        initWebView();
        mWebView.loadUrl(mUrl);
    }

    private void initWebView() {
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);                       //可執行js
        webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);   //設置頁面默認縮放密度
        webSettings.setDefaultTextEncodingName("UTF-8");              //設置默認的文本編碼名稱,以便在解碼html頁面時使用
        webSettings.setAllowContentAccess(true);                      //啓動或禁用WebView內的內容URL訪問
        webSettings.setAppCacheEnabled(false);                        //設置是否應該啓用應用程序緩存api
        webSettings.setBuiltInZoomControls(false);                    //設置WebView是否應該使用其內置的縮放機制
        webSettings.setUseWideViewPort(true);                         //設置WebView是否應該支持viewport
        webSettings.setLoadWithOverviewMode(true);                    //不管WebView是否在概述模式中載入頁面,將內容放大適合屏幕寬度
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);          //重寫緩存的使用方式
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);   //告知js自動打開窗口
        webSettings.setLoadsImagesAutomatically(true);                //設置WebView是否應該載入圖像資源
        webSettings.setAllowFileAccess(true);                         //啓用或禁用WebView內的文件訪問
        webSettings.setDomStorageEnabled(true);                       //設置是否啓用了DOM存儲API,默認爲false
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (!(url.startsWith("http") || url.startsWith("https"))) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                }
                view.loadUrl(url);
                return true;
            }
        });
        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                if (!TextUtils.isEmpty(title))
                mTitleTv.setText(title);
            }
        });
        mWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                LogUtils.log("啓動下載:" + mUrl);
                LogUtils.log("has download:"+url);
                new DownloadUtils(WebViewActivity.this,url,getIntent().getStringExtra(KEY_DOWNLOAD_NAME)+".apk").startDownloadWithReport(getIntent().getStringArrayListExtra(KEY_S_DOWNLOAD),getIntent().getStringArrayListExtra(KEY_E_DOWNLOAD),getIntent().getStringArrayListExtra(KEY_S_INSTALL),getIntent().getStringArrayListExtra(KEY_E_INSTALL));
            }
        });

    }
    //點擊回退按鈕不是退出應用程序,而是返回上一個頁面
    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
        }else {
            super.onBackPressed();
        }
    }
}

 

 

-------

 

再送上使用Android DownloadManager下載的代碼一份,監聽到下載請求時使用:

點擊此處,飛機直達

 

--------

 

發佈了43 篇原創文章 · 獲贊 51 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章