webview整套

package com.warmlight.voicepacket.web;

import android.content.Context;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Message;
import android.support.v4.math.MathUtils;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.GeolocationPermissions;
import android.webkit.JsPromptResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.io.File;
import java.net.URLDecoder;
import java.util.Hashtable;

import retrofit2.http.HTTP;

public class Html5WebView extends WebView {

    private Context mContext;

    public Html5WebView(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public Html5WebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Html5WebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void init() {
        WebSettings mWebSettings = getSettings();
        mWebSettings.setSupportZoom(true);
        mWebSettings.setLoadWithOverviewMode(true);
        mWebSettings.setUseWideViewPort(true);
        mWebSettings.setDefaultTextEncodingName("utf-8");
        //適配https圖片顯示
        mWebSettings.setLoadsImagesAutomatically(true); // 支持自動加載圖片
        mWebSettings.setBlockNetworkImage(false);//解決圖片不顯示
        //調用JS方法.安卓版本大於17,加上註解 @JavascriptInterface
        mWebSettings.setJavaScriptEnabled(true);
        mWebSettings.setSupportMultipleWindows(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

        //緩存數據
        saveData(mWebSettings);
        newWin(mWebSettings);
        setWebChromeClient(new BaseWebChromeClient());
        setWebViewClient(new BaseWebViewClient());
        setOnLongClickListener(new OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return true;
            }
        });
    }

    /**
     * 多窗口的問題
     */
    private void newWin(WebSettings mWebSettings) {
        //html中的_bank標籤就是新建窗口打開,有時會打不開,需要加以下
        //然後 複寫 WebChromeClient的onCreateWindow方法
        mWebSettings.setSupportMultipleWindows(false);
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    }

    /**
     * HTML5數據存儲
     */
    private void saveData(WebSettings mWebSettings) {
        //有時候網頁需要自己保存一些關鍵數據,Android WebView 需要自己設置

        if (NetStatusUtil.isConnected(mContext)) {
            mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根據cache-control決定是否從網絡上取數據。
        } else {
            mWebSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//沒網,則從本地獲取,即離線加載
        }
        File cacheDir = mContext.getCacheDir();
        if (cacheDir != null) {
            String appCachePath = cacheDir.getAbsolutePath();
            mWebSettings.setDomStorageEnabled(true);
            mWebSettings.setDatabaseEnabled(true);
            mWebSettings.setAppCacheEnabled(true);
            mWebSettings.setAppCachePath(appCachePath);
        }
    }

    /**
     * 實現一個基礎的 WebViewClient ,如果有更多的需要,直接繼承它
     */
    static class BaseWebViewClient extends WebViewClient {

        /**
         * 多頁面在同一個WebView中打開,就是不新建activity或者調用系統瀏覽器打開
         */
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            super.onReceivedSslError(view, handler, error);
            handler.proceed();// 接受所有網站的證書
        }
    }

    /**
     * 實現一個基礎的 WebChromeClient ,如果有更多的需要,直接繼承它
     */
    static class BaseWebChromeClient extends WebChromeClient {
        //=========HTML5定位==========================================================
        //需要先加入權限
        //<uses-permission android:name="android.permission.INTERNET"/>
        //<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        //<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        @Override
        public void onReceivedIcon(WebView view, Bitmap icon) {
            super.onReceivedIcon(view, icon);
        }

        @Override
        public void onGeolocationPermissionsHidePrompt() {
            super.onGeolocationPermissionsHidePrompt();
        }

        @Override
        public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback
                callback) {
            callback.invoke(origin, true, false);//注意個函數,第二個參數就是是否同意定位權限,第三個是是否希望內核記住
            super.onGeolocationPermissionsShowPrompt(origin, callback);
        }
        //=========HTML5定位==========================================================


        //=========多窗口的問題==========================================================
        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(view);
            resultMsg.sendToTarget();
            return true;
        }
        //=========多窗口的問題==========================================================
    }

}
package com.warmlight.voicepacket.web;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.DownloadListener;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.warmlight.voicepacket.R;
import com.warmlight.voicepacket.base.BaseActivity;

import org.json.JSONArray;

import java.util.Hashtable;

public class WebViewActivity extends BaseActivity implements View.OnClickListener {

    private String mUrl;
    private String title;

    private FrameLayout mLayout;
    private ProgressBar mSeekBar;
    private Html5WebView mWebView;

    public static void loadUrl(Context context,String url,String title){
        Intent intent = new Intent(context,WebViewActivity.class);
        intent.putExtra("url",url);
        intent.putExtra("title",title);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題欄
        setContentView(R.layout.activity_web);

        getParameter();

        mLayout = (FrameLayout) findViewById(R.id.web_layout);
        mSeekBar = (ProgressBar) findViewById(R.id.web_sbr);
        LinearLayout ll_back = (LinearLayout) findViewById(R.id.ll_back);
        TextView tv_header_titlename = (TextView) findViewById(R.id.tv_header_titlename);
        if (TextUtils.isEmpty(title)){
            tv_header_titlename.setText("玩皮語音包");

        }else {
            tv_header_titlename.setText(title);
        }
        ll_back.setOnClickListener(this);
        // 創建 WebView
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        mWebView = new Html5WebView(getApplicationContext());
        mWebView.setLayoutParams(params);
        mLayout.addView(mWebView);
        mWebView.setWebChromeClient(new Html5WebChromeClient());
        mWebView.setWebViewClient(new MyWebViewClient());
        mWebView.loadUrl(mUrl);
        mWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
                // 處理下載事件
                Uri uri = Uri.parse(url); // url爲你要鏈接的地址
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ll_back:
                if (mWebView != null && mWebView.canGoBack()) {
                    mWebView.goBack();
                } else {
                    WebViewActivity.this.finish();
                }
                break;
        }
    }

    class MyWebViewClient extends Html5WebView.BaseWebViewClient{
        @Override
        public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
            mSeekBar.setProgress(0);
            mSeekBar.setVisibility(View.VISIBLE);
        }

        @Override
        public void onPageFinished(WebView webView, String s) {
            mSeekBar.setVisibility(View.INVISIBLE);
//                writeData();
        }

        @Override
        public void onReceivedError(WebView webView, int i, String s, String s1) {

        }

        /**
         * 防止加載網頁時調起系統瀏覽器
         */
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    // 繼承 WebView 裏面實現的基類
    class Html5WebChromeClient extends Html5WebView.BaseWebChromeClient {

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            // 頂部顯示網頁加載進度
            mSeekBar.setProgress(newProgress);
            if (newProgress == 100){
                mSeekBar.setVisibility(View.GONE);
            }
        }

    }

    @Override
    protected void onDestroy() {
        // 銷燬 WebView
        if (mWebView != null) {
            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebView.clearHistory();

            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.destroy();
            mWebView = null;
        }
        super.onDestroy();
    }

    public void getParameter() {
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            mUrl = bundle.getString("url");
            title = bundle.getString("title");
        } else {
            mUrl = "https://wing-li.github.io/";
            title = "玩皮語音包";
        }
//        mUrl = "https://m.ajimiyou.com/tg/?from=test";
    }

    //============================= 下面是本 demo  的邏輯代碼
    // ======================================================================================

    /**
     * 按目錄鍵,彈出“關閉頁面”的選項
     */
//    @Override
//    public boolean onCreateOptionsMenu(Menu menu) {
//        getMenuInflater().inflate(R.menu.menu, menu);
//        return super.onCreateOptionsMenu(menu);
//    }
//
//    @Override
//    public boolean onOptionsItemSelected(MenuItem item) {
//
//        int itemId = item.getItemId();
//        switch (itemId) {
//            case R.id.close:
//                WebViewActivity.this.finish();
//                return true;
//            case R.id.copy:
//                ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
//                String url = mWebView.getUrl();
//                ClipData clipData = ClipData.newPlainText("test", url);
//                if (clipboardManager != null) {
//                    clipboardManager.setPrimaryClip(clipData);
//                    Toast.makeText(getApplicationContext(), "本頁網址複製成功", Toast.LENGTH_SHORT).show();
//                }
//                return true;
//        }
//        return super.onOptionsItemSelected(item);
//    }

    private long mOldTime;

    /**
     * 點擊“返回鍵”,返回上一層
     * 雙擊“返回鍵”,返回到最開始進來時的網頁
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
//            if (System.currentTimeMillis() - mOldTime < 1500) {
//                mWebView.clearHistory();
//                mWebView.loadUrl(mUrl);
//            } else
            if (mWebView.canGoBack()) {
                mWebView.goBack();
            } else {
                WebViewActivity.this.finish();
            }
//            mOldTime = System.currentTimeMillis();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章