美文网首页
Android WebView 辅助类

Android WebView 辅助类

作者: afkT | 来源:发表于2020-01-26 22:27 被阅读0次

    DevUtils Github

    方法 注释
    setWebView 设置 WebView
    getWebView 获取 WebView
    isWebViewNotEmpty WebView 是否不为 null
    setBuilder 设置 WebView 常用配置构建类
    getBuilder 获取 WebView 常用配置构建类
    apply 应用 ( 设置 ) 配置
    setGlobalBuilder 设置全局 WebView 常用配置构建类
    getGlobalBuilder 获取全局 WebView 常用配置构建类
    loadUrl 加载网页
    loadData 加载 Html 代码
    loadDataWithBaseURL 加载 Html 代码
    postUrl 使用 POST 方法将带有 postData 的 url 加载到 WebView 中
    getSettings 获取 WebView 配置
    getUserAgentString 获取浏览器标识 UA
    setUserAgentString 设置浏览器标识
    addJavascriptInterface 添加 JS 交互注入对象
    removeJavascriptInterface 移除 JS 交互注入对象
    evaluateJavascript 执行 JS 方法
    setWebViewClient 设置处理各种通知和请求事件对象
    getWebViewClient 获取处理各种通知和请求事件对象
    setWebChromeClient 设置辅助 WebView 处理 Javascript 对话框、标题等对象
    getWebChromeClient 获取辅助 WebView 处理 Javascript 对话框、标题等对象
    destroy 销毁处理
    canGoBack WebView 是否可以后退
    goBack WebView 后退
    canGoForward WebView 是否可以前进
    goForward WebView 前进
    canGoBackOrForward WebView 是否可以跳转到当前起始点相距的历史记录
    goBackOrForward WebView 跳转到当前起始点相距的历史记录
    reload 刷新页面 ( 当前页面的所有资源都会重新加载 )
    stopLoading 停止加载
    clearCache 清除资源缓存
    clearHistory 清除当前 WebView 访问的历史记录
    clearFormData 清除自动完成填充的表单数据
    getScale 获取缩放比例
    getScrollY 获取当前可见区域的顶端距整个页面顶端的距离 ( 当前内容滚动的距离 )
    getScrollX 获取当前内容横向滚动距离
    getContentHeight 获取 HTML 的高度 ( 原始高度, 不包括缩放后的高度 )
    getScaleHeight 获取缩放高度
    getHeight 获取 WebView 控件高度
    pageDown 将视图内容向下滚动一半页面大小
    pageUp 将视图内容向上滚动一半页面大小
    handlerKeyDown 处理按键 ( 是否回退 )
    setLayerTypeSoftware 关闭 WebView 硬件加速功能
    setLayerType 设置 WebView 硬件加速类型
    getUrl 获取当前 Url
    getOriginalUrl 获取最初请求 Url
    getHitTestResult 获取长按事件类型
    setCookie 将 Cookie 设置到 WebView
    getCookie 获取指定 Url 的 Cookie
    removeCookie 移除 Cookie
    removeSessionCookie 移除 Session Cookie
    removeAllCookie 移除所有的 Cookie
    setOnApplyListener 设置应用配置监听事件
    getApplyListener 获取应用配置监听事件
    clone 克隆方法 ( 用于全局配置克隆操作 )
    reset 重置方法
    isJavaScriptEnabled 是否支持 JavaScript
    setJavaScriptEnabled 设置是否支持 JavaScript
    getRenderPriority 获取渲染优先级
    setRenderPriority 设置渲染优先级
    isUseWideViewPort 是否使用宽视图
    setUseWideViewPort 设置是否使用宽视图
    isLoadWithOverviewMode 是否按宽度缩小内容以适合屏幕
    setLoadWithOverviewMode 设置是否按宽度缩小内容以适合屏幕
    getLayoutAlgorithm 获取基础布局算法
    setLayoutAlgorithm 设置基础布局算法
    isSupportZoom 是否支持缩放
    setSupportZoom 设置是否支持缩放
    isBuiltInZoomControls 是否显示内置缩放工具
    setBuiltInZoomControls 设置是否显示内置缩放工具
    isDisplayZoomControls 是否显示缩放工具
    setDisplayZoomControls 设置是否显示缩放工具
    getTextZoom 获取文本缩放倍数
    setTextZoom 设置文本缩放倍数
    getStandardFontFamily 获取 WebView 字体
    setStandardFontFamily 设置 WebView 字体
    getDefaultFontSize 获取 WebView 字体大小
    setDefaultFontSize 设置 WebView 字体大小
    getMinimumFontSize 获取 WebView 支持最小字体大小
    setMinimumFontSize 设置 WebView 支持最小字体大小
    getMixedContentMode 获取混合内容模式
    setMixedContentMode 设置混合内容模式
    isLoadsImagesAutomatically 是否支持自动加载图片
    setLoadsImagesAutomatically 设置是否支持自动加载图片
    isJavaScriptCanOpenWindowsAutomatically 是否支持通过 JS 打开新窗口
    setJavaScriptCanOpenWindowsAutomatically 设置是否支持通过 JS 打开新窗口
    getDefaultTextEncodingName 获取编码格式
    setDefaultTextEncodingName 设置编码格式
    isGeolocationEnabled 是否允许网页执行定位操作
    setGeolocationEnabled 设置是否允许网页执行定位操作
    isAllowFileAccess 是否可以访问文件 ( false 不影响 assets 和 resources 资源的加载 )
    setAllowFileAccess 设置是否可以访问文件 ( false 不影响 assets 和 resources 资源的加载 )
    isAllowFileAccessFromFileURLs 是否允许通过 file url 加载的 JS 代码读取其他的本地文件
    setAllowFileAccessFromFileURLs 设置是否允许通过 file url 加载的 JS 代码读取其他的本地文件
    isAllowUniversalAccessFromFileURLs 是否允许通过 file url 加载的 JS 可以访问其他的源 ( 包括 http、https 等源 )
    setAllowUniversalAccessFromFileURLs 设置是否允许通过 file url 加载的 JS 可以访问其他的源 ( 包括 http、https 等源 )
    getCacheMode 获取 WebView 缓存模式
    setCacheMode 设置 WebView 缓存模式
    isDomStorageEnabled 是否支持 DOM Storage
    setDomStorageEnabled 设置是否支持 DOM Storage
    isAppCacheEnabled 是否开启 Application Caches 功能
    setAppCacheEnabled 设置是否开启 Application Caches 功能
    getAppCachePath 获取 Application Caches 地址
    setAppCachePath 设置 Application Caches 地址
    getAppCacheMaxSize 获取 Application Caches 大小
    setAppCacheMaxSize 设置 Application Caches 大小
    isDatabaseEnabled 是否支持数据库缓存
    setDatabaseEnabled 设置是否支持数据库缓存
    getDatabasePath 获取数据库缓存路径
    setDatabasePath 设置数据库缓存路径
    onApply 应用配置通知方法
    package dev.assist;
    
    import android.graphics.Paint;
    import android.os.Build;
    import android.support.annotation.RequiresApi;
    import android.view.KeyEvent;
    import android.view.View;
    import android.webkit.CookieManager;
    import android.webkit.CookieSyncManager;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    import java.util.Map;
    
    import dev.DevUtils;
    import dev.utils.LogPrintUtils;
    import dev.utils.app.ViewUtils;
    
    /**
     * detail: WebView 辅助类
     * @author Ttt
     * <pre>
     *     WebView 截图使用 {@link dev.utils.app.CapturePictureUtils#snapshotByWebView(WebView)}
     *     <p></p>
     *     WebView 全面解析
     *     @see <a href="https://www.jianshu.com/p/3e0136c9e748"/>
     *     Android WebView 常见问题及解决方案汇总
     *     @see <a href="https://www.cnblogs.com/Free-Thinker/p/6179016.html"/>
     *     WebView 与 JavaScript 的交互总结
     *     @see <a href="https://www.jianshu.com/p/5cc2eae14e07"/>
     *     WebView 使用漏洞
     *     @see <a href="https://blog.csdn.net/carson_ho/article/details/64904635"/>
     *     Android Webview H5 交互之 LocalStorage
     *     @see <a href="https://www.jianshu.com/p/379a0681ce25"/>
     * </pre>
     */
    public class WebViewAssist {
    
        // 日志 TAG
        private static final String TAG = WebViewAssist.class.getSimpleName();
        // WebView
        private WebView mWebView;
        // WebView 常用配置构建类
        private Builder mBuilder;
        // 全局配置
        private static Builder sGlobalBuilder;
    
        public WebViewAssist() {
            this(true);
        }
    
        /**
         * 构造函数
         * <pre>
         *     使用全局配置, 需要手动调用 {@link #apply} 方法
         * </pre>
         * @param listener 是否复用监听事件
         */
        public WebViewAssist(final boolean listener) {
            if (sGlobalBuilder != null) {
                mBuilder = sGlobalBuilder.clone(listener);
            }
        }
    
        /**
         * 设置 WebView
         * <pre>
         *     如果在 {@link #setWebView} 前调用了 {@link #setBuilder} 则需要手动调用 {@link #apply}
         * </pre>
         * @param webView {@link WebView}
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setWebView(final WebView webView) {
            this.mWebView = webView;
            return this;
        }
    
        /**
         * 获取 WebView
         * @return {@link WebView}
         */
        public WebView getWebView() {
            return mWebView;
        }
    
        /**
         * WebView 是否不为 null
         * @return {@code true} yes, {@code false} no
         */
        public boolean isWebViewNotEmpty() {
            return mWebView != null;
        }
    
        /**
         * 设置 WebView 常用配置构建类
         * @param builder {@link Builder}
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setBuilder(final Builder builder) {
            return setBuilder(builder, true);
        }
    
        /**
         * 设置 WebView 常用配置构建类
         * @param builder {@link Builder}
         * @param apply   是否应用配置
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setBuilder(final Builder builder, final boolean apply) {
            this.mBuilder = builder;
            if (this.mBuilder != null) {
                this.mBuilder.setWebViewAssist(this);
                if (apply) {
                    this.mBuilder.apply();
                }
            }
            return this;
        }
    
        /**
         * 获取 WebView 常用配置构建类
         * @return {@link Builder}
         */
        public Builder getBuilder() {
            return mBuilder;
        }
    
        /**
         * 应用 ( 设置 ) 配置
         * @return {@link Builder}
         */
        public WebViewAssist apply() {
            return setBuilder(mBuilder);
        }
    
        // =
    
        /**
         * 设置全局 WebView 常用配置构建类
         * @param builder {@link Builder}
         */
        public static void setGlobalBuilder(final Builder builder) {
            WebViewAssist.sGlobalBuilder = builder;
        }
    
        /**
         * 获取全局 WebView 常用配置构建类
         * @return {@link Builder}
         */
        public static Builder getGlobalBuilder() {
            return WebViewAssist.sGlobalBuilder;
        }
    
        // ============
        // = 加载方法 =
        // ============
    
        /**
         * 加载网页
         * <pre>
         *     加载一个网页
         *     loadUrl("http://www.baidu.com")
         *     加载应用资源文件内的网页
         *     loadUrl("file:///android_asset/test.html")
         * </pre>
         * @param url 资源地址
         * @return {@link WebViewAssist}
         */
        public WebViewAssist loadUrl(final String url) {
            if (isWebViewNotEmpty()) {
                mWebView.loadUrl(url);
            }
            return this;
        }
    
        /**
         * 加载网页
         * @param url                   资源地址
         * @param additionalHttpHeaders Http 请求头信息
         * @return {@link WebViewAssist}
         */
        public WebViewAssist loadUrl(final String url, final Map<String, String> additionalHttpHeaders) {
            if (isWebViewNotEmpty()) {
                mWebView.loadUrl(url, additionalHttpHeaders);
            }
            return this;
        }
    
        /**
         * 加载 Html 代码
         * @param data     Html 数据
         * @param mimeType 加载网页的类型
         * @param encoding 编码格式
         * @return {@link WebViewAssist}
         * @deprecated 推荐使用 loadDataWithBaseURL
         */
        @Deprecated
        public WebViewAssist loadData(final String data, final String mimeType, final String encoding) {
            if (isWebViewNotEmpty()) {
                mWebView.loadData(data, mimeType, encoding);
            }
            return this;
        }
    
        /**
         * 加载 Html 代码
         * @param baseUrl    基础链接
         * @param data       Html 数据
         * @param mimeType   加载网页的类型
         * @param encoding   编码格式
         * @param historyUrl 可用历史记录
         * @return {@link WebViewAssist}
         */
        public WebViewAssist loadDataWithBaseURL(final String baseUrl, final String data, final String mimeType, final String encoding, final String historyUrl) {
            if (isWebViewNotEmpty()) {
                mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
            }
            return this;
        }
    
        /**
         * 使用 POST 方法将带有 postData 的 url 加载到 WebView 中
         * <pre>
         *     如果 url 不是网络 url {@link #loadUrl(String)} 加载
         * </pre>
         * @param url      资源地址
         * @param postData post 数据 ( 注意 UrlEncode )
         * @return {@link WebViewAssist}
         */
        public WebViewAssist postUrl(final String url, final byte[] postData) {
            if (isWebViewNotEmpty()) {
                mWebView.postUrl(url, postData);
            }
            return this;
        }
    
        // =
    
        /**
         * 加载 Html 代码
         * @param data Html 数据
         * @return {@link WebViewAssist}
         */
        public WebViewAssist loadDataWithBaseURL(final String data) {
            return loadDataWithBaseURL(null, data, null);
        }
    
        /**
         * 加载 Html 代码
         * @param baseUrl    基础链接
         * @param data       Html 数据
         * @param historyUrl 可用历史记录
         * @return {@link WebViewAssist}
         */
        public WebViewAssist loadDataWithBaseURL(final String baseUrl, final String data, final String historyUrl) {
            return loadDataWithBaseURL(baseUrl, data, "text/html", "utf-8", historyUrl);
        }
    
        // ================
        // = 快速操作方法 =
        // ================
    
        /**
         * 获取 WebView 配置
         * @return {@link WebSettings}
         */
        public WebSettings getSettings() {
            return isWebViewNotEmpty() ? mWebView.getSettings() : null;
        }
    
        /**
         * 获取浏览器标识 UA
         * @return 浏览器标识 UA
         */
        public String getUserAgentString() {
            WebSettings webSettings = getSettings();
            return (webSettings != null) ? webSettings.getUserAgentString() : null;
        }
    
        /**
         * 设置浏览器标识
         * @param ua 浏览器标识
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setUserAgentString(final String ua) {
            WebSettings webSettings = getSettings();
            if (webSettings != null) {
                webSettings.setUserAgentString(ua);
            }
            return this;
        }
    
        // =
    
        /**
         * 添加 JS 交互注入对象
         * @param obj           JavaScript 交互方法注入对象
         * @param interfaceName 在 JavaScript 中公开对象的名称
         * @return {@link WebViewAssist}
         */
        public WebViewAssist addJavascriptInterface(final Object obj, final String interfaceName) {
            if (isWebViewNotEmpty()) {
                mWebView.addJavascriptInterface(obj, interfaceName);
            }
            return this;
        }
    
        /**
         * 移除 JS 交互注入对象
         * @param interfaceName 在 JavaScript 中公开对象的名称
         * @return {@link WebViewAssist}
         */
        public WebViewAssist removeJavascriptInterface(final String interfaceName) {
            if (isWebViewNotEmpty()) {
                mWebView.removeJavascriptInterface(interfaceName);
            }
            return this;
        }
    
        /**
         * 执行 JS 方法
         * @param script         JS 内容
         * @param resultCallback 执行回调结果 ( 返回值 )
         * @return {@link WebViewAssist}
         */
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        public WebViewAssist evaluateJavascript(final String script, final ValueCallback<String> resultCallback) {
            if (isWebViewNotEmpty()) {
                try {
                    mWebView.evaluateJavascript(script, resultCallback);
                } catch (Exception e) {
                    LogPrintUtils.eTag(TAG, e, "evaluateJavascript");
                }
            }
            return this;
        }
    
        // =
    
        /**
         * 设置处理各种通知和请求事件对象
         * <pre>
         *     常用方法
         *     onPageStarted()onPageFinished() 页面加载时和页面加载完毕时调用
         *     shouldOverrideKeyEvent() 重写此方法才能处理浏览器中的按键事件
         *     shouldInterceptRequest() 页面每一次请求资源之前都会调用这个方法 ( 非 UI 线程调用 )
         *     onLoadResource() 页面加载资源时调用, 每加载一个资源 ( 比如图片 ) 就调用一次
         *     onReceivedError() 加载页面的服务器出现错误 ( 比如 404 ) 时回调
         *     onReceivedSslError() 重写此方法可以让 WebView 处理 https 请求
         *     doUpdateVisitedHistory() 更新历史记录
         *     onFormResubmission() 应用程序重新请求网页数据
         *     onReceivedHttpAuthRequest() 获取返回信息授权请求
         *     onScaleChanged() WebView 发生缩放改变时调用
         *     onUnhandledKeyEvent() Key 事件未被加载时调用
         * </pre>
         * @param client {@link WebViewClient}
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setWebViewClient(final WebViewClient client) {
            if (isWebViewNotEmpty()) {
                mWebView.setWebViewClient(client);
            }
            return this;
        }
    
        /**
         * 获取处理各种通知和请求事件对象
         * @return {@link WebViewClient}
         */
        @RequiresApi(api = Build.VERSION_CODES.O)
        public WebViewClient getWebViewClient() {
            return isWebViewNotEmpty() ? mWebView.getWebViewClient() : null;
        }
    
        // =
    
        /**
         * 设置辅助 WebView 处理 Javascript 对话框、标题等对象
         * <pre>
         *     常用方法
         *     onProgressChanged() 获得网页的加载进度并显示
         *     onReceivedTitle() 获得网页的标题时回调
         *     onReceivedIcon() 获得网页的图标时回调
         *     onCreateWindow() 打开新窗口时回调
         *     onCloseWindow() 关闭窗口时回调
         *     onJsAlert() 网页弹出提示框时触发此方法
         *     onJsConfirm() 网页弹出确认框时触发此方法
         *     onJsPrompt() 网页弹出输入框时触发此方法
         * </pre>
         * @param client {@link WebChromeClient}
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setWebChromeClient(final WebChromeClient client) {
            if (isWebViewNotEmpty()) {
                mWebView.setWebChromeClient(client);
            }
            return this;
        }
    
        /**
         * 获取辅助 WebView 处理 Javascript 对话框、标题等对象
         * @return {@link WebChromeClient}
         */
        @RequiresApi(api = Build.VERSION_CODES.O)
        public WebChromeClient getWebChromeClient() {
            return isWebViewNotEmpty() ? mWebView.getWebChromeClient() : null;
        }
    
        // =
    
        /**
         * 销毁处理
         * <pre>
         *     避免 WebView 引起的内存泄漏
         *     可通过 WebView 所在的 Activity 新启一个进程结束时 System.exit(0) 退出当前进程
         *     Activity onDestroy use
         * </pre>
         * @return {@link WebViewAssist}
         */
        public WebViewAssist destroy() {
            if (isWebViewNotEmpty()) {
                mWebView.clearHistory();
                ViewUtils.removeSelfFromParent(mWebView);
                mWebView.loadUrl("about:blank");
                mWebView.stopLoading();
                mWebView.setWebChromeClient(null);
                mWebView.setWebViewClient(null);
                mWebView.destroy();
                mWebView = null;
                if (mBuilder != null) {
                    mBuilder.setWebViewAssist(null);
                }
            }
            return this;
        }
    
        /**
         * WebView 是否可以后退
         * @return {@code true} yes, {@code false} no
         */
        public boolean canGoBack() {
            return isWebViewNotEmpty() ? mWebView.canGoBack() : false;
        }
    
        /**
         * WebView 后退
         * @return {@link WebViewAssist}
         */
        public WebViewAssist goBack() {
            if (isWebViewNotEmpty()) {
                mWebView.goBack();
            }
            return this;
        }
    
        // =
    
        /**
         * WebView 是否可以前进
         * @return {@code true} yes, {@code false} no
         */
        public boolean canGoForward() {
            return isWebViewNotEmpty() ? mWebView.canGoForward() : false;
        }
    
        /**
         * WebView 前进
         * @return {@link WebViewAssist}
         */
        public WebViewAssist goForward() {
            if (isWebViewNotEmpty()) {
                mWebView.goForward();
            }
            return this;
        }
    
        // =
    
        /**
         * WebView 是否可以跳转到当前起始点相距的历史记录
         * @param steps 相距索引
         * @return {@code true} yes, {@code false} no
         */
        public boolean canGoBackOrForward(final int steps) {
            return isWebViewNotEmpty() ? mWebView.canGoBackOrForward(steps) : false;
        }
    
        /**
         * WebView 跳转到当前起始点相距的历史记录
         * <pre>
         *     以当前的 index 为起始点前进或者后退到历史记录中指定的 steps
         *     如果 steps 为负数则为后退, 正数则为前进
         * </pre>
         * @param steps 相距索引
         * @return {@link WebViewAssist}
         */
        public WebViewAssist goBackOrForward(final int steps) {
            if (isWebViewNotEmpty()) {
                mWebView.goBackOrForward(steps);
            }
            return this;
        }
    
        // =
    
        /**
         * 刷新页面 ( 当前页面的所有资源都会重新加载 )
         * @return {@link WebViewAssist}
         */
        public WebViewAssist reload() {
            if (isWebViewNotEmpty()) {
                mWebView.reload();
            }
            return this;
        }
    
        /**
         * 停止加载
         * @return {@link WebViewAssist}
         */
        public WebViewAssist stopLoading() {
            if (isWebViewNotEmpty()) {
                mWebView.stopLoading();
            }
            return this;
        }
    
        /**
         * 清除资源缓存
         * <pre>
         *     缓存是针对每个应用程序的, 因此这将清除所有使用的 WebView 的缓存
         * </pre>
         * @param includeDiskFiles 是否清空本地缓存 ( false 则只会清空内存缓存, true 全部清空 )
         * @return {@link WebViewAssist}
         */
        public WebViewAssist clearCache(final boolean includeDiskFiles) {
            if (isWebViewNotEmpty()) {
                mWebView.clearCache(includeDiskFiles);
            }
            return this;
        }
    
        /**
         * 清除当前 WebView 访问的历史记录
         * @return {@link WebViewAssist}
         */
        public WebViewAssist clearHistory() {
            if (isWebViewNotEmpty()) {
                mWebView.clearHistory();
            }
            return this;
        }
    
        /**
         * 清除自动完成填充的表单数据
         * <pre>
         *     并不会清除 WebView 存储到本地的数据
         * </pre>
         * @return {@link WebViewAssist}
         */
        public WebViewAssist clearFormData() {
            if (isWebViewNotEmpty()) {
                mWebView.clearFormData();
            }
            return this;
        }
    
        /**
         * 获取缩放比例
         * @return 缩放比例
         */
        public float getScale() {
            if (isWebViewNotEmpty()) {
                return mWebView.getScale();
            }
            return 1.0f;
        }
    
        /**
         * 获取当前可见区域的顶端距整个页面顶端的距离 ( 当前内容滚动的距离 )
         * @return 当前内容滚动的距离
         */
        public int getScrollY() {
            return isWebViewNotEmpty() ? mWebView.getScrollY() : 0;
        }
    
        /**
         * 获取当前内容横向滚动距离
         * @return 当前内容横向滚动距离
         */
        public int getScrollX() {
            return isWebViewNotEmpty() ? mWebView.getScrollX() : 0;
        }
    
        /**
         * 获取 HTML 的高度 ( 原始高度, 不包括缩放后的高度 )
         * <pre>
         *     可通过 setWebViewClient onScaleChanged(WebView view, float oldScale, float newScale) 获取缩放比例
         *     或者通过 webView.getScale(); 获取 ( 该方法已抛弃 )
         * </pre>
         * @return HTML 的高度 ( 原始高度, 不包括缩放后的高度 )
         */
        public int getContentHeight() {
            return isWebViewNotEmpty() ? mWebView.getContentHeight() : 0;
        }
    
        /**
         * 获取缩放高度
         * @return 缩放高度
         */
        public int getScaleHeight() {
            return getScaleHeight(getScale());
        }
    
        /**
         * 获取缩放高度
         * @param scale 缩放比例
         * @return 缩放高度
         */
        public int getScaleHeight(final float scale) {
            return (int) (getContentHeight() * scale);
        }
    
        /**
         * 获取 WebView 控件高度
         * @return WebView 控件高度
         */
        public int getHeight() {
            return isWebViewNotEmpty() ? mWebView.getHeight() : 0;
        }
    
        /**
         * 将视图内容向下滚动一半页面大小
         * @param bottom 是否滑动到底部
         * @return {@link WebViewAssist}
         */
        public WebViewAssist pageDown(final boolean bottom) {
            if (isWebViewNotEmpty()) {
                mWebView.pageDown(bottom);
            }
            return this;
        }
    
        /**
         * 将视图内容向上滚动一半页面大小
         * @param top 是否滑动到顶部
         * @return {@link WebViewAssist}
         */
        public WebViewAssist pageUp(final boolean top) {
            if (isWebViewNotEmpty()) {
                mWebView.pageUp(top);
            }
            return this;
        }
    
        /**
         * 处理按键 ( 是否回退 )
         * <pre>
         *     Activity use
         *     @Override
         *     public boolean onKeyDown(int keyCode, KeyEvent event) {
         *          if (webViewAssist.handlerKeyDown(keyCode, event)) return true;
         *          return super.onKeyDown(keyCode, event);
         *     }
         * </pre>
         * @param keyCode 按键类型
         * @param event   按键事件
         * @return {@code true} 拦截事件, {@code false} 不拦截接着处理
         */
        public boolean handlerKeyDown(final int keyCode, final KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && canGoBack()) {
                goBack();
                return true;
            }
            return false;
        }
    
        /**
         * 关闭 WebView 硬件加速功能
         * <pre>
         *     解决 WebView 闪烁问题
         * </pre>
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setLayerTypeSoftware() {
            return setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    
        /**
         * 设置 WebView 硬件加速类型
         * @param layerType 硬件加速类型
         * @param paint     {@link Paint}
         * @return {@link WebViewAssist}
         */
        public WebViewAssist setLayerType(final int layerType, final Paint paint) {
            if (isWebViewNotEmpty()) {
                mWebView.setLayerType(layerType, paint);
            }
            return this;
        }
    
        /**
         * 获取当前 Url
         * @return 当前 Url
         */
        public String getUrl() {
            return isWebViewNotEmpty() ? mWebView.getUrl() : null;
        }
    
        /**
         * 获取最初请求 Url
         * @return 最初请求 Url
         */
        public String getOriginalUrl() {
            return isWebViewNotEmpty() ? mWebView.getOriginalUrl() : null;
        }
    
        /**
         * 获取长按事件类型
         * <pre>
         *     WebView.HitTestResult.UNKNOWN_TYPE // 未知类型
         *     WebView.HitTestResult.PHONE_TYPE // 电话类型
         *     WebView.HitTestResult.EMAIL_TYPE // 电子邮件类型
         *     WebView.HitTestResult.GEO_TYPE // 地图类型
         *     WebView.HitTestResult.SRC_ANCHOR_TYPE // 超链接类型
         *     WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE // 带有链接的图片类型
         *     WebView.HitTestResult.IMAGE_TYPE // 单纯的图片类型
         *     WebView.HitTestResult.EDIT_TEXT_TYPE // 选中的文字类型
         *     <p></p>
         *     mWebView.setOnLongClickListener(new View.OnLongClickListener() {
         *          @Override
         *          public boolean onLongClick(View view) {
         *              WebView.HitTestResult result = webViewAssist.getHitTestResult();
         *              if(result != null) {
         *                  switch (result.getType()) {
         *                      case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
         *                          String imgUrl = result.getExtra();
         *                          return true;
         *                  }
         *              }
         *              return false;
         *          }
         *      });
         *      <p></p>
         *      HitTestResult.getType() 获取所选中目标的类型, 可以是图片、超链接、邮件、电话等等
         *      HitTestResult.getExtra() 获取额外的信息
         * </pre>
         * @return 长按事件类型
         */
        public WebView.HitTestResult getHitTestResult() {
            return isWebViewNotEmpty() ? mWebView.getHitTestResult() : null;
        }
    
        // ==========
        // = Cookie =
        // ==========
    
        /**
         * 将 Cookie 设置到 WebView
         * <pre>
         *     若两次设置相同, 则覆盖上一次的
         *     同步 Cookie 要在 WebView 加载 url 之前, 否则 WebView 无法获得相应的 Cookie, 也就无法通过验证
         *     Cookie 应该被及时更新, 否则很可能导致 WebView 拿的是旧的 session id 和服务器进行通信
         * </pre>
         * @param url    加载的 Url
         * @param cookie 同步的 cookie
         * @return {@code true} success, {@code false} fail
         */
        public static boolean setCookie(final String url, final String cookie) {
            try {
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                    CookieSyncManager.createInstance(DevUtils.getContext());
                }
                CookieManager cookieManager = CookieManager.getInstance();
                // 如果没有特殊需求, 这里只需要将 session id 以 "key=value" 形式作为 Cookie 即可
                cookieManager.setCookie(url, cookie);
                return true;
            } catch (Exception e) {
                LogPrintUtils.eTag(TAG, e, "setCookie");
            }
            return false;
        }
    
        /**
         * 获取指定 Url 的 Cookie
         * @param url Url
         * @return Cookie
         */
        public static String getCookie(final String url) {
            try {
                CookieManager cookieManager = CookieManager.getInstance();
                return cookieManager.getCookie(url);
            } catch (Exception e) {
                LogPrintUtils.eTag(TAG, e, "getCookie");
            }
            return null;
        }
    
        /**
         * 移除 Cookie
         * @param callback 移除回调
         */
        public static void removeCookie(final ValueCallback<Boolean> callback) {
            removeSessionCookie(callback);
            removeAllCookie(callback);
        }
    
        /**
         * 移除 Session Cookie
         * @param callback 移除回调
         * @return {@code true} success, {@code false} fail
         */
        public static boolean removeSessionCookie(final ValueCallback<Boolean> callback) {
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    CookieManager.getInstance().removeSessionCookies(callback);
                } else {
                    CookieManager.getInstance().removeSessionCookie();
                }
                return true;
            } catch (Exception e) {
                LogPrintUtils.eTag(TAG, e, "removeSessionCookie");
            }
            return false;
        }
    
        /**
         * 移除所有的 Cookie
         * @param callback 移除回调
         * @return {@code true} success, {@code false} fail
         */
        public static boolean removeAllCookie(final ValueCallback<Boolean> callback) {
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    CookieManager.getInstance().removeAllCookies(callback);
                } else {
                    CookieManager.getInstance().removeAllCookie();
                }
                return true;
            } catch (Exception e) {
                LogPrintUtils.eTag(TAG, e, "removeAllCookie");
            }
            return false;
        }
    
        // ============
        // = 配置相关 =
        // ============
    
        /**
         * detail: WebView 常用配置构建类
         * @author Ttt
         * <pre>
         *     有特殊配置可在 {@link OnApplyListener#onApply(WebViewAssist, Builder)} 回调中进行增加配置设置
         * </pre>
         */
        public static class Builder {
    
            // WebView 辅助类
            private WebViewAssist mWebViewAssist;
            // 应用配置监听事件
            private OnApplyListener mApplyListener;
    
            public Builder() {
            }
    
            /**
             * 构造函数
             * @param applyListener 应用配置监听事件
             */
            public Builder(final OnApplyListener applyListener) {
                setOnApplyListener(applyListener);
            }
    
            // =
    
            /**
             * 设置 WebView 辅助类
             * @param webViewAssist WebView 辅助类
             * @return {@link Builder}
             */
            private Builder setWebViewAssist(final WebViewAssist webViewAssist) {
                this.mWebViewAssist = webViewAssist;
                return this;
            }
    
            /**
             * 应用 ( 设置 ) 配置
             * @return {@link Builder}
             */
            public Builder apply() {
                return applyPri();
            }
    
            // ========
            // = 事件 =
            // ========
    
            /**
             * 设置应用配置监听事件
             * @param applyListener {@link OnApplyListener}
             * @return {@link Builder}
             */
            public Builder setOnApplyListener(final OnApplyListener applyListener) {
                this.mApplyListener = applyListener;
                return this;
            }
    
            /**
             * 获取应用配置监听事件
             * @return {@link OnApplyListener}
             */
            public OnApplyListener getApplyListener() {
                return mApplyListener;
            }
    
            /**
             * detail: 应用配置监听事件
             * @author Ttt
             */
            public interface OnApplyListener {
    
                /**
                 * 应用配置通知方法
                 * @param webViewAssist WebView 辅助类
                 * @param builder       WebView 常用配置构建类
                 */
                void onApply(WebViewAssist webViewAssist, Builder builder);
            }
    
            // ============
            // = 克隆方法 =
            // ============
    
            /**
             * 克隆方法 ( 用于全局配置克隆操作 )
             * @param listener 是否复用监听事件
             * @return {@link Builder}
             */
            public Builder clone(final boolean listener) {
                Builder builder = new Builder();
                if (listener) { // 复用监听事件
                    builder.setOnApplyListener(mApplyListener);
                }
                builder.mJavaScriptEnabled = mJavaScriptEnabled;
                builder.mRenderPriority = mRenderPriority;
                builder.mUseWideViewPort = mUseWideViewPort;
                builder.mLoadWithOverviewMode = mLoadWithOverviewMode;
                builder.mLayoutAlgorithm = mLayoutAlgorithm;
                builder.mSupportZoom = mSupportZoom;
                builder.mBuiltInZoomControls = mBuiltInZoomControls;
                builder.mDisplayZoomControls = mDisplayZoomControls;
                builder.mTextZoom = mTextZoom;
                builder.mStandardFontFamily = mStandardFontFamily;
                builder.mDefaultFontSize = mDefaultFontSize;
                builder.mMinimumFontSize = mMinimumFontSize;
                builder.mMixedContentMode = mMixedContentMode;
                builder.mLoadsImagesAutomatically = mLoadsImagesAutomatically;
                builder.mJavaScriptCanOpenWindowsAutomatically = mJavaScriptCanOpenWindowsAutomatically;
                builder.mDefaultTextEncodingName = mDefaultTextEncodingName;
                builder.mGeolocationEnabled = mGeolocationEnabled;
                builder.mUserAgentString = mUserAgentString;
                builder.mAllowFileAccess = mAllowFileAccess;
                builder.mAllowFileAccessFromFileURLs = mAllowFileAccessFromFileURLs;
                builder.mAllowUniversalAccessFromFileURLs = mAllowUniversalAccessFromFileURLs;
                builder.mCacheMode = mCacheMode;
                builder.mDomStorageEnabled = mDomStorageEnabled;
                builder.mAppCacheEnabled = mAppCacheEnabled;
                builder.mAppCachePath = mAppCachePath;
                builder.mAppCacheMaxSize = mAppCacheMaxSize;
                builder.mDatabaseEnabled = mDatabaseEnabled;
                builder.mDatabasePath = mDatabasePath;
                return builder;
            }
    
            /**
             * 重置方法
             * @return {@link Builder}
             */
            public Builder reset() {
                this.mJavaScriptEnabled = true;
                this.mRenderPriority = null;
                this.mUseWideViewPort = false;
                this.mLoadWithOverviewMode = true;
                this.mLayoutAlgorithm = null;
                this.mSupportZoom = true;
                this.mBuiltInZoomControls = false;
                this.mDisplayZoomControls = false;
                this.mTextZoom = 0;
                this.mStandardFontFamily = null;
                this.mDefaultFontSize = 0;
                this.mMinimumFontSize = 0;
                this.mMixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW;
                this.mLoadsImagesAutomatically = true;
                this.mJavaScriptCanOpenWindowsAutomatically = true;
                this.mDefaultTextEncodingName = "utf-8";
                this.mGeolocationEnabled = true;
                this.mUserAgentString = null;
                this.mAllowFileAccess = true;
                this.mAllowFileAccessFromFileURLs = false;
                this.mAllowUniversalAccessFromFileURLs = false;
                this.mCacheMode = WebSettings.LOAD_NO_CACHE;
                this.mDomStorageEnabled = true;
                this.mAppCacheEnabled = true;
                this.mAppCachePath = null;
                this.mAppCacheMaxSize = 5 * 1024 * 1024;
                this.mDatabaseEnabled = true;
                this.mDatabasePath = null;
                return this;
            }
    
            // ============
            // = 配置方法 =
            // ============
    
            // 是否支持 JavaScript
            private boolean mJavaScriptEnabled = true;
            // 渲染优先级
            private WebSettings.RenderPriority mRenderPriority = null;
            // 是否使用宽视图 ( 是否支持 html viewport 设置了会导致字体变小 )
            private boolean mUseWideViewPort = false;
            // 是否按宽度缩小内容以适合屏幕
            private boolean mLoadWithOverviewMode = true;
            // 基础布局算法
            private WebSettings.LayoutAlgorithm mLayoutAlgorithm = null;
            // 是否支持缩放
            private boolean mSupportZoom = true;
            // 是否显示内置缩放工具
            private boolean mBuiltInZoomControls = false;
            // 是否显示缩放工具
            private boolean mDisplayZoomControls = false;
            // 文本缩放倍数
            private int mTextZoom = 0;
            // WebView 字体, 默认字体 "sans-serif"
            private String mStandardFontFamily = null;
            // WebView 字体大小
            private int mDefaultFontSize = 0;
            // WebView 支持最小字体大小
            private int mMinimumFontSize = 0;
            // 混合内容模式
            private int mMixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW;
            // 是否支持自动加载图片
            private boolean mLoadsImagesAutomatically = true;
            // 是否支持通过 JS 打开新窗口
            private boolean mJavaScriptCanOpenWindowsAutomatically = true;
            // 编码格式
            private String mDefaultTextEncodingName = "utf-8";
            // 是否允许网页执行定位操作
            private boolean mGeolocationEnabled = true;
            // 浏览器标识 UA
            private String mUserAgentString = null;
            // 是否可以访问文件 ( false 不影响 assets 和 resources 资源的加载 )
            private boolean mAllowFileAccess = true;
            // 是否允许通过 file url 加载的 JS 代码读取其他的本地文件
            private boolean mAllowFileAccessFromFileURLs = false;
            // 是否允许通过 file url 加载的 JS 可以访问其他的源 ( 包括 http、https 等源 )
            private boolean mAllowUniversalAccessFromFileURLs = false;
            // WebView 缓存模式
            private int mCacheMode = WebSettings.LOAD_NO_CACHE;
            // 是否支持 DOM Storage
            private boolean mDomStorageEnabled = true;
            // 是否开启 Application Caches 功能
            private boolean mAppCacheEnabled = true;
            // Application Caches 地址
            private String mAppCachePath = null;
            // Application Caches 大小
            private long mAppCacheMaxSize = 5 * 1024 * 1024;
            // 是否支持数据库缓存
            private boolean mDatabaseEnabled = true;
            // 数据库缓存路径
            private String mDatabasePath = null;
    
            /**
             * 应用 ( 设置 ) 配置
             * @return {@link Builder}
             */
            private Builder applyPri() {
                if (mWebViewAssist != null) {
                    WebSettings webSettings = mWebViewAssist.getSettings();
                    if (webSettings != null) {
                        // 如果访问的页面中要与 JavaScript 交互, 则 WebView 必须设置支持 JavaScript
                        webSettings.setJavaScriptEnabled(mJavaScriptEnabled);
    
                        if (mRenderPriority != null) {
                            webSettings.setRenderPriority(mRenderPriority);  // 设置渲染优先级
                        }
    
                        // 设置自适应屏幕两者合用
                        webSettings.setUseWideViewPort(mUseWideViewPort); // 是否使用宽视图
                        webSettings.setLoadWithOverviewMode(mLoadWithOverviewMode); // 是否按宽度缩小内容以适合屏幕
                        if (mLayoutAlgorithm != null) { // WebSettings.LayoutAlgorithm.SINGLE_COLUMN 4.4 抛弃了
                            webSettings.setLayoutAlgorithm(mLayoutAlgorithm);
                        }
    
                        // 缩放操作
                        webSettings.setSupportZoom(mSupportZoom); // 是否支持缩放
                        webSettings.setBuiltInZoomControls(mBuiltInZoomControls); // 是否显示内置缩放工具, 若为 false 则该 WebView 不可缩放
                        webSettings.setDisplayZoomControls(mDisplayZoomControls); // 是否显示缩放工具
    
                        if (mTextZoom > 0) {
                            webSettings.setTextZoom(mTextZoom); // 文本缩放倍数
                        }
                        if (mStandardFontFamily != null) {
                            webSettings.setStandardFontFamily(mStandardFontFamily); // 设置 WebView 字体
                        }
                        if (mDefaultFontSize > 0) {
                            webSettings.setDefaultFontSize(mDefaultFontSize); // 设置 WebView 字体大小
                        }
                        if (mMinimumFontSize > 0) {
                            webSettings.setMinimumFontSize(mMinimumFontSize); // 设置 WebView 支持最小字体大小
                        }
    
                        // 5.0 以上默认禁止了 https 和 http 混用以下方式是开启
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            webSettings.setMixedContentMode(mMixedContentMode);
                        }
    
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                            webSettings.setLoadsImagesAutomatically(mLoadsImagesAutomatically); // 是否支持自动加载图片
                        }
    
                        // 是否支持通过 JS 打开新窗口
                        webSettings.setJavaScriptCanOpenWindowsAutomatically(mJavaScriptCanOpenWindowsAutomatically);
                        // 设置编码格式
                        if (mDefaultTextEncodingName != null) {
                            webSettings.setDefaultTextEncodingName(mDefaultTextEncodingName);
                        }
                        // 是否允许网页执行定位操作
                        webSettings.setGeolocationEnabled(mGeolocationEnabled);
                        // 设置浏览器标识 UA
                        if (mUserAgentString != null) {
                            webSettings.setUserAgentString(mUserAgentString);
                        }
    
                        // 是否可以访问文件
                        webSettings.setAllowFileAccess(mAllowFileAccess);
                        // 是否允许通过 file url 加载的 JS 代码读取其他的本地文件
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            webSettings.setAllowFileAccessFromFileURLs(mAllowFileAccessFromFileURLs);
                        }
                        // 是否允许通过 file url 加载的 JS 可以访问其他的源 ( 包括 http、https 等源 )
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            webSettings.setAllowUniversalAccessFromFileURLs(mAllowUniversalAccessFromFileURLs);
                        }
                        // 设置 WebView 缓存模式
                        if (mCacheMode > 0) {
                            // LOAD_CACHE_ONLY 不使用网络, 只读取本地缓存数据
                            // LOAD_DEFAULT ( 默认 ) 根据 cache-control 决定是否从网络上取数据
                            // LOAD_NO_CACHE 不使用缓存, 只从网络获取数据.
                            // LOAD_CACHE_ELSE_NETWORK 只要本地有, 无论是否过期或者 no-cache 都使用缓存中的数据
                            webSettings.setCacheMode(mCacheMode);
                        }
    
                        // 是否支持 DOM Storage
                        webSettings.setDomStorageEnabled(mDomStorageEnabled);
                        // 是否开启 Application Caches 功能
                        webSettings.setAppCacheEnabled(mAppCacheEnabled);
                        if (mAppCacheEnabled) {
                            // Application Caches 地址
                            if (mAppCachePath != null) {
                                webSettings.setAppCachePath(mAppCachePath);
                            }
                            // Application Caches 大小
                            webSettings.setAppCacheMaxSize(mAppCacheMaxSize);
                        }
    
                        // 是否支持数据库缓存
                        webSettings.setDatabaseEnabled(mDatabaseEnabled);
                        if (mDatabaseEnabled) {
                            // 数据库缓存路径
                            if (mDatabasePath != null) {
                                webSettings.setDatabasePath(mDatabasePath);
                            }
                        }
                    }
                }
    
                if (mApplyListener != null) {
                    mApplyListener.onApply(mWebViewAssist, this);
                }
                return this;
            }
    
            // ===========
            // = get/set =
            // ===========
    
            /**
             * 是否支持 JavaScript
             * @return {@code true} yes, {@code false} no
             */
            public boolean isJavaScriptEnabled() {
                return mJavaScriptEnabled;
            }
    
            /**
             * 设置是否支持 JavaScript
             * @param javaScriptEnabled {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setJavaScriptEnabled(final boolean javaScriptEnabled) {
                this.mJavaScriptEnabled = javaScriptEnabled;
                return this;
            }
    
            /**
             * 获取渲染优先级
             * @return 渲染优先级
             */
            public WebSettings.RenderPriority getRenderPriority() {
                return mRenderPriority;
            }
    
            /**
             * 设置渲染优先级
             * @param renderPriority 渲染优先级
             * @return {@link Builder}
             */
            public Builder setRenderPriority(final WebSettings.RenderPriority renderPriority) {
                this.mRenderPriority = renderPriority;
                return this;
            }
    
            /**
             * 是否使用宽视图
             * @return {@code true} yes, {@code false} no
             */
            public boolean isUseWideViewPort() {
                return mUseWideViewPort;
            }
    
            /**
             * 设置是否使用宽视图
             * <pre>
             *      是否支持 html viewport 设置了会导致字体变小
             * </pre>
             * @param useWideViewPort {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setUseWideViewPort(final boolean useWideViewPort) {
                this.mUseWideViewPort = useWideViewPort;
                return this;
            }
    
            /**
             * 是否按宽度缩小内容以适合屏幕
             * @return {@code true} yes, {@code false} no
             */
            public boolean isLoadWithOverviewMode() {
                return mLoadWithOverviewMode;
            }
    
            /**
             * 设置是否按宽度缩小内容以适合屏幕
             * @param loadWithOverviewMode {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setLoadWithOverviewMode(final boolean loadWithOverviewMode) {
                this.mLoadWithOverviewMode = loadWithOverviewMode;
                return this;
            }
    
            /**
             * 获取基础布局算法
             * @return 基础布局算法
             */
            public WebSettings.LayoutAlgorithm getLayoutAlgorithm() {
                return mLayoutAlgorithm;
            }
    
            /**
             * 设置基础布局算法
             * @param layoutAlgorithm 基础布局算法
             * @return {@link Builder}
             */
            public Builder setLayoutAlgorithm(final WebSettings.LayoutAlgorithm layoutAlgorithm) {
                this.mLayoutAlgorithm = layoutAlgorithm;
                return this;
            }
    
            /**
             * 是否支持缩放
             * @return {@code true} yes, {@code false} no
             */
            public boolean isSupportZoom() {
                return mSupportZoom;
            }
    
            /**
             * 设置是否支持缩放
             * @param supportZoom {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setSupportZoom(final boolean supportZoom) {
                this.mSupportZoom = supportZoom;
                return this;
            }
    
            /**
             * 是否显示内置缩放工具
             * @return {@code true} yes, {@code false} no
             */
            public boolean isBuiltInZoomControls() {
                return mBuiltInZoomControls;
            }
    
            /**
             * 设置是否显示内置缩放工具
             * @param builtInZoomControls {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setBuiltInZoomControls(final boolean builtInZoomControls) {
                this.mBuiltInZoomControls = builtInZoomControls;
                return this;
            }
    
            /**
             * 是否显示缩放工具
             * @return {@code true} yes, {@code false} no
             */
            public boolean isDisplayZoomControls() {
                return mDisplayZoomControls;
            }
    
            /**
             * 设置是否显示缩放工具
             * @param displayZoomControls {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setDisplayZoomControls(final boolean displayZoomControls) {
                this.mDisplayZoomControls = displayZoomControls;
                return this;
            }
    
            /**
             * 获取文本缩放倍数
             * @return 文本缩放倍数
             */
            public int getTextZoom() {
                return mTextZoom;
            }
    
            /**
             * 设置文本缩放倍数
             * @param textZoom 文本缩放倍数
             * @return {@link Builder}
             */
            public Builder setTextZoom(final int textZoom) {
                this.mTextZoom = textZoom;
                return this;
            }
    
            /**
             * 获取 WebView 字体
             * @return WebView 字体
             */
            public String getStandardFontFamily() {
                return mStandardFontFamily;
            }
    
            /**
             * 设置 WebView 字体
             * @param standardFontFamily WebView 字体
             * @return {@link Builder}
             */
            public Builder setStandardFontFamily(final String standardFontFamily) {
                this.mStandardFontFamily = standardFontFamily;
                return this;
            }
    
            /**
             * 获取 WebView 字体大小
             * @return WebView 字体大小
             */
            public int getDefaultFontSize() {
                return mDefaultFontSize;
            }
    
            /**
             * 设置 WebView 字体大小
             * @param defaultFontSize WebView 字体大小
             * @return {@link Builder}
             */
            public Builder setDefaultFontSize(final int defaultFontSize) {
                this.mDefaultFontSize = defaultFontSize;
                return this;
            }
    
            /**
             * 获取 WebView 支持最小字体大小
             * @return WebView 支持最小字体大小
             */
            public int getMinimumFontSize() {
                return mMinimumFontSize;
            }
    
            /**
             * 设置 WebView 支持最小字体大小
             * @param minimumFontSize WebView 支持最小字体大小
             * @return {@link Builder}
             */
            public Builder setMinimumFontSize(final int minimumFontSize) {
                this.mMinimumFontSize = minimumFontSize;
                return this;
            }
    
            /**
             * 获取混合内容模式
             * @return 混合内容模式
             */
            public int getMixedContentMode() {
                return mMixedContentMode;
            }
    
            /**
             * 设置混合内容模式
             * @param mixedContentMode 混合内容模式
             * @return {@link Builder}
             */
            public Builder setMixedContentMode(final int mixedContentMode) {
                this.mMixedContentMode = mixedContentMode;
                return this;
            }
    
            /**
             * 是否支持自动加载图片
             * @return {@code true} yes, {@code false} no
             */
            public boolean isLoadsImagesAutomatically() {
                return mLoadsImagesAutomatically;
            }
    
            /**
             * 设置是否支持自动加载图片
             * @param loadsImagesAutomatically {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setLoadsImagesAutomatically(final boolean loadsImagesAutomatically) {
                this.mLoadsImagesAutomatically = loadsImagesAutomatically;
                return this;
            }
    
            /**
             * 是否支持通过 JS 打开新窗口
             * @return {@code true} yes, {@code false} no
             */
            public boolean isJavaScriptCanOpenWindowsAutomatically() {
                return mJavaScriptCanOpenWindowsAutomatically;
            }
    
            /**
             * 设置是否支持通过 JS 打开新窗口
             * @param javaScriptCanOpenWindowsAutomatically {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setJavaScriptCanOpenWindowsAutomatically(final boolean javaScriptCanOpenWindowsAutomatically) {
                this.mJavaScriptCanOpenWindowsAutomatically = javaScriptCanOpenWindowsAutomatically;
                return this;
            }
    
            /**
             * 获取编码格式
             * @return 编码格式
             */
            public String getDefaultTextEncodingName() {
                return mDefaultTextEncodingName;
            }
    
            /**
             * 设置编码格式
             * @param defaultTextEncodingName 编码格式
             * @return {@link Builder}
             */
            public Builder setDefaultTextEncodingName(final String defaultTextEncodingName) {
                this.mDefaultTextEncodingName = defaultTextEncodingName;
                return this;
            }
    
            /**
             * 是否允许网页执行定位操作
             * @return {@code true} yes, {@code false} no
             */
            public boolean isGeolocationEnabled() {
                return mGeolocationEnabled;
            }
    
            /**
             * 设置是否允许网页执行定位操作
             * @param geolocationEnabled {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setGeolocationEnabled(final boolean geolocationEnabled) {
                this.mGeolocationEnabled = geolocationEnabled;
                return this;
            }
    
            /**
             * 获取浏览器标识 UA
             * @return 浏览器标识 UA
             */
            public String getUserAgentString() {
                return mUserAgentString;
            }
    
            /**
             * 设置浏览器标识 UA
             * @param userAgentString 浏览器标识 UA
             * @return {@link Builder}
             */
            public Builder setUserAgentString(final String userAgentString) {
                this.mUserAgentString = userAgentString;
                return this;
            }
    
            /**
             * 是否可以访问文件 ( false 不影响 assets 和 resources 资源的加载 )
             * @return {@code true} yes, {@code false} no
             */
            public boolean isAllowFileAccess() {
                return mAllowFileAccess;
            }
    
            /**
             * 设置是否可以访问文件 ( false 不影响 assets 和 resources 资源的加载 )
             * @param allowFileAccess {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setAllowFileAccess(final boolean allowFileAccess) {
                this.mAllowFileAccess = allowFileAccess;
                return this;
            }
    
            /**
             * 是否允许通过 file url 加载的 JS 代码读取其他的本地文件
             * @return {@code true} yes, {@code false} no
             */
            public boolean isAllowFileAccessFromFileURLs() {
                return mAllowFileAccessFromFileURLs;
            }
    
            /**
             * 设置是否允许通过 file url 加载的 JS 代码读取其他的本地文件
             * @param allowFileAccessFromFileURLs {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setAllowFileAccessFromFileURLs(final boolean allowFileAccessFromFileURLs) {
                this.mAllowFileAccessFromFileURLs = allowFileAccessFromFileURLs;
                return this;
            }
    
            /**
             * 是否允许通过 file url 加载的 JS 可以访问其他的源 ( 包括 http、https 等源 )
             * @return {@code true} yes, {@code false} no
             */
            public boolean isAllowUniversalAccessFromFileURLs() {
                return mAllowUniversalAccessFromFileURLs;
            }
    
            /**
             * 设置是否允许通过 file url 加载的 JS 可以访问其他的源 ( 包括 http、https 等源 )
             * @param allowUniversalAccessFromFileURLs {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setAllowUniversalAccessFromFileURLs(final boolean allowUniversalAccessFromFileURLs) {
                this.mAllowUniversalAccessFromFileURLs = allowUniversalAccessFromFileURLs;
                return this;
            }
    
            /**
             * 获取 WebView 缓存模式
             * @return WebView 缓存模式
             */
            public int getCacheMode() {
                return mCacheMode;
            }
    
            /**
             * 设置 WebView 缓存模式
             * @param cacheMode WebView 缓存模式
             * @return {@link Builder}
             */
            public Builder setCacheMode(final int cacheMode) {
                this.mCacheMode = cacheMode;
                return this;
            }
    
            /**
             * 是否支持 DOM Storage
             * @return {@code true} yes, {@code false} no
             */
            public boolean isDomStorageEnabled() {
                return mDomStorageEnabled;
            }
    
            /**
             * 设置是否支持 DOM Storage
             * @param domStorageEnabled {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setDomStorageEnabled(final boolean domStorageEnabled) {
                this.mDomStorageEnabled = domStorageEnabled;
                return this;
            }
    
            /**
             * 是否开启 Application Caches 功能
             * @return {@code true} yes, {@code false} no
             */
            public boolean isAppCacheEnabled() {
                return mAppCacheEnabled;
            }
    
            /**
             * 设置是否开启 Application Caches 功能
             * @param appCacheEnabled {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setAppCacheEnabled(final boolean appCacheEnabled) {
                this.mAppCacheEnabled = appCacheEnabled;
                return this;
            }
    
            /**
             * 获取 Application Caches 地址
             * @return Application Caches 地址
             */
            public String getAppCachePath() {
                return mAppCachePath;
            }
    
            /**
             * 设置 Application Caches 地址
             * @param appCachePath Application Caches 地址
             * @return {@link Builder}
             */
            public Builder setAppCachePath(final String appCachePath) {
                this.mAppCachePath = appCachePath;
                return this;
            }
    
            /**
             * 获取 Application Caches 大小
             * @return Application Caches 大小
             */
            public long getAppCacheMaxSize() {
                return mAppCacheMaxSize;
            }
    
            /**
             * 设置 Application Caches 大小
             * @param appCacheMaxSize Application Caches 大小
             * @return {@link Builder}
             */
            public Builder setAppCacheMaxSize(final long appCacheMaxSize) {
                this.mAppCacheMaxSize = appCacheMaxSize;
                return this;
            }
    
            /**
             * 是否支持数据库缓存
             * @return {@code true} yes, {@code false} no
             */
            public boolean isDatabaseEnabled() {
                return mDatabaseEnabled;
            }
    
            /**
             * 设置是否支持数据库缓存
             * @param databaseEnabled {@code true} yes, {@code false} no
             * @return {@link Builder}
             */
            public Builder setDatabaseEnabled(final boolean databaseEnabled) {
                this.mDatabaseEnabled = databaseEnabled;
                return this;
            }
    
            /**
             * 获取数据库缓存路径
             * @return 数据库缓存路径
             */
            public String getDatabasePath() {
                return mDatabasePath;
            }
    
            /**
             * 设置数据库缓存路径
             * @param databasePath 数据库缓存路径
             * @return {@link Builder}
             */
            public Builder setDatabasePath(final String databasePath) {
                this.mDatabasePath = databasePath;
                return this;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Android WebView 辅助类

          本文链接:https://www.haomeiwen.com/subject/lkrsthtx.html