Android WebView 辅助类

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;
    }

    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值