WebView

文档中涉及到的类说明:

mWebView: com.tencent.smtt.sdk.WebView
WebChromeClient: com.tencent.smtt.sdk.WebChromeClient

1 功能类

1.1 js用户提示框

提示框包括:alert、prompt、confirm、beforeUnload

mWebView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(
        WebView webview, 
        String url, 
        String message, 
        JsResult result) {
        //可以弹框或进行其它处理,但一定要回调result.confirm或者cancel
        //这里要返回true否则内核会进行提示
        return true;
    }
    @Override
    public boolean onJsConfirm(
        WebView webview, 
        String url, 
        String message, 
        JsResult result) {
        //可以弹框或进行其它处理,但一定要回调result.confirm或者cancel
        return true;
    }
    @Override
    public boolean onJsBeforeUnload(
        WebView webview, 
        String url, 
        String message, 
        JsResult result) {
        //可以弹框或进行其它处理,但一定要回调result.confirm或者cancel
        return true;
    }
    @Override
    public boolean onJsPrompt(
        WebView webview, 
        String url,
        String message, 
        String defaultvalue, 
        JsPromptResult result) {
        //可以弹框或进行其它处理,但一定要回调result.confirm或者cancel,confirm可以将用户输入作为参数
        return true;
    }
});

当页面有对应的js提示时会回调对应的方法;如果没有设置这些内核将会使用默认弹出样式提示用户

1.2 保存网页

使用方法有两种:

 /**

- Saves the current view as a web archive.
- @param filename the filename where the archive should be placed
  */
  mWebView .saveWebArchive(String filename)
  /**
- Saves the current view as a web archive.
  *
- @param basename the filename where the archive should be placed
- @param autoname if false, takes basename to be a file. If true, basename
- is assumed to be a directory in which a filename will be
- chosen according to the URL of the current page.
- @param callback called after the web archive has been saved. The
- parameter for onReceiveValue will either be the filename
- under which the file was saved, or null if saving the
- file failed.
  */
mWebView.saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback)

1.3 翻页、滚动及滚动条样式

包括快速向上、向下翻页

/**
* Scrolls the contents of this WebView down by half the page size.
*
* @param bottom true to jump to bottom of page
* @return true if the page was scrolled
**/
mWebView. pageDown(boolean bottom)

/**
*
* Scrolls the contents of this WebView up by half the view size.
*
* @param top true to jump to the top of the page
* @return true if the page was scrolled
**/
mWebView. pageUp(boolean top)
//滚动:
mWebview.getView().scrollTo(x,y)
/**
* 设置滚动条样式
*/
//竖直快速滑块,设置null可去除
mWebview.getX5WebViewExtension().setVerticalTrackDrawable (Drawable drawable)
//判断水平滚动条是否启动
mWebview.getX5WebViewExtension().isHorizontalScrollBarEnabled ()
//启用或禁用水平滚动条
mWebview.getX5WebViewExtension().setHorizontalScrollBarEnabled (boolean enabled)
//判断竖直滚动条是否启动
mWebview.getX5WebViewExtension().isVerticalScrollBarEnabled ()
//启用或禁用竖直滚动条
mWebview.getX5WebViewExtension().setVerticalScrollBarEnabled (boolean enabled)
//设置滚动条渐隐消失的时间段
mWebview.getX5WebViewExtension().setScrollBarFadeDuration(int duration)
//设置滚动条多久开始渐隐消失
mWebview.getX5WebViewExtension().setScrollBarDefaultDelayBeforeFade (int delay)

1.4 URL拦截

对于url打开会回调该接口

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        //这里可以对特殊scheme进行拦截处理
        return true;//要返回true否则内核会继续处理
    }
});

或者

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        //这里可以对特殊scheme进行拦截处理
        return true;//要返回true否则内核会继续处理
    }
}

1.5 定位

定位功能内核默认开启,提供关闭接口,当用户请求定位时会回调对应client的授权接口,具体如下:

//可以关闭定位功能,内核默认是开启的
mWebView.getSettings().setGeolocationEnabled(false);

public interface GeolocationPermissionsCallback {
    /**
    * origin:要保存的授权域
    * allow:是否允许定位
    * remember:该记录是否持久化保存,保存后可以调用相应的缓存清除接口进行清除
    */
    void invoke(String origin, boolean allow, boolean remember);
}

mWebView.setWebChromeClient(new WebChromeClient() {
  @Override
  public void onGeolocationPermissionsShowPrompt(
    String origin, 
    GeolocationPermissionsCallback callback) {
    //在此可以弹窗提示用户
    //处理后需要回调
    //参数的意义见上面的接口说明
    callback.invoke(origin, true, false);
  }
});

1.6 截屏

截当前视口内容

/**
* 截屏,截取webview可视区域
* bitmap 绘制用的bitmap
* drawCursor 是否画光标---保留暂未使用
* drawScrollbar是否截取滚动条---保留暂未使用.
* drawTitleBar是否截取标题栏---保留暂未使用
* drawWithBuffer是否使用buffer---保留暂未使用
* scaleX----x方向缩放比例
* scaleY----y方向缩放比例
* callback截图完成后的回调,如果设置为null将为同步调用,否则是异步调用
*/
mWebView.getX5WebViewExtension().snapshotVisible(
    Bitmap bitmap, 
    boolean drawCursor, 
    boolean drawScrollbars, 
    boolean drawTitleBar, 
    boolean drawWithBuffer, 
    float scaleX, 
    float scaleY, 
    Runnable callback
);

截整个网页

/**
* 截整页,截取整个webview
* 绘制canvas
* drawScrollbar是否截取滚动条---保留暂未使用
* drawTitleBar是否截取标题栏---保留暂未使用
*/
mWebView.getX5WebViewExtension().snapshotWholePage(
    Canvas canvas,
    boolean drawScrollbars, 
    boolean drawTitleBar
)

注:以上Canvas需要使用bitmap类型的Canvas

1.7 文件选择

方法一: 文件单选:设置client回调

mWebView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void openFileChooser(
        ValueCallback<Uri> uploadFile,
        String acceptType, 
        String captureType) {
        //保存对应的valuecallback供选择后使用
        //通过startActivityForResult启动文件选择窗口或自定义文件选择
    } 
});

文件多选:设置client回调

mWebView.setWebChromeClientExtension(new ProxyWebChromeClientExtension() {
    @Override
    public void openFileChooser(
        android.webkit.ValueCallback<Uri[]> uploadFile, 
        String acceptType,
        String captureType) {
        //保存对应的valuecallback供选择后使用
        //通过startActivityForResult启动文件选择窗口或自定义文件选择    
    }
});

方法二: 设置client回调(单选多选均会回调该接口)

mWebView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onShowFileChooser(
        IX5WebViewBase webView, 
        ValueCallback<Uri[]> filePathCallback,
        FileChooserParams fileChooserParams) {
        //保存对应的valuecallback供选择后使用
        //通过startActivityForResult启动文件选择窗口或自定义文件选择
    }    
});

然后在activity返回时将用户的选择设置给对应的ValueCallback

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //如果是文件选择
    if (resultCode == RESULT_OK) {
        //给文件选择的ValueCallback设置onReceiveValue值
    } else if (resultCode == RESULT_CANCELED) {
        //给文件选择的ValueCallback设置null值
    }
}

1.8 缓存清除

方法一:针对性删除

//清除cookie 
CookieManager.getInstance().removeAllCookies(null); 
//清除storage相关缓存
WebStorage.getInstance().deleteAllData();;
//清除用户密码信息
WebViewDatabase.getInstance(Context context).clearUsernamePassword();
//清除httpauth信息
WebViewDatabase.getInstance(Context context).clearHttpAuthUsernamePassword();
//清除表单数据
WebViewDatabase.getInstance(Context context).clearFormData();
//清除页面icon图标信息
WebIconDatabase.getInstance().removeAllIcons();
//删除地理位置授权,也可以删除某个域名的授权(参考接口类)
GeolocationPermissions.getInstance().clearAll();

方法二:一次性删除所有缓存

//清除cookie
QbSdk.clearAllWebViewCache(Context context,boolean isClearCookie) 

1.9 js注入和执行

注入对象:

mWebView.addJavascriptInterface(Object obj, String interfaceName)

删除注入对象:

mWebView.removeJavascriptInterface(String interfaceName)

执行:

mWebView.evaluateJavascript(String script, ValueCallback<String> resultCallback)

1.10 前进后退

单步前进后退接口:

//需要先判断mWebView.canGoBack()
mWebView.goBack();
//需要先判断mWebView.canGoForward()
mWebView.goForward();

前进后退统一接口及设置跨度

//例如:index为-1表示后退,index为1表示前进
mWebView.goBackOrForward(index) 

前进后退结束回调

mWebView.setWebChromeClientExtension(new ProxyWebChromeClientExtension() {
    /**
    *页面前进后退切换完成事件通知,目前step无实际赋值,此接口只是一个完成通知
    */
    @Override
    public void onBackforwardFinished(int step) {

    }
});

1.11 HttpAuth密码记录及使用

当访问页面需要输入用户名和密码时会回调对应client接口

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedHttpAuthRequest(
        WebView view, 
        HttpAuthHandler handler, 
        String host, 
        String realm) {
    //首先判断是否可以重复使用对应用户名和密码如果可以则获取已保存的密码(获取成功后直接使用)
    //如果不允许重复使用用户名和密码或者未保存用户名和密码则需要提示用户输入
    //用户输入用户名和密码后可以将对应数据保存
    }
});
//获取密码接口
mWebView.getHttpAuthUsernamePassword(host, realm)
//保存密码接口
mWebView.setHttpAuthUsernamePassword(String host, String realm,String username, String password)

1.12 网页查找

//查找字符串:
//还有一个同步方法findAll(text)不建议使用
mWebView.findAllAsync(text);
//查找上一项、下一项:
//为true时表示下一项,为false时表示上一项
mWebView.findNext(boolean forward);
//清除查找项:
mWebView.clearMatches()
//如果需要提示用户当前查找的内容有几个以及获取当前选中了哪个,可以用如下回调
mWebView.setFindListener(new IX5WebViewBase.FindListener() {
    @Override
    public void onFindResultReceived(
        int activeMatchOrdinal, 
        int numberOfMatches, 
        boolean isDoneCounting) {
    }
});

1.13 密码保存

密码记录功能有对应的设置开关,默认开启

//关闭密码保存
mWebView.getSettings().setSavePassword(false);

密码保存未关闭时,内核默认有密码保存提升框,如需要重写密码提示可以按照如下接口进行处理:

mWebView.setWebChromeClientExtension(new ProxyWebChromeClientExtension() {
    /*
    * callback:处理后的回调;
    * schemePlusHost:域名;
    * username:用户名;
    * password:密码;
    * nameElement:用户名输入框名称;
    * passwordElement:密码输入框名称;
    * isReplace:是否是替换操作
    */
    @Override
    public boolean onSavePassword(
        android.webkit.ValueCallback<String> callback, 
        String schemePlusHost, 
        String username, 
        String password, 
        String nameElement,
        String passwordElement, 
        boolean isReplace) {
        //这里可以弹窗提示用户
        //这里调用将会保存用户名和密码,如果只保存用户名可以将密码置为null,如果两者均不存在则不需要调用该接口
        mWebView.getX5WebViewExtension()
        .sendRememberMsg(schemePlusHost, username, password, nameElement, passwordElement);

        //处理完后需要回调该接口,执行了保存操作参数为true,否则为false
        callback.onReceiveValue("true");
        //这里要返回true,否则内核会提示用户保存密码
        return true;
    }
});

1.14 异常上报

当app crash时为了能定位内核问题需要将内核版本号和内核辅助信息一起上报,获取内核版本号和辅助信息的接口如下:

//返回内核版本号
QbSdk.getTbsVersion(Context context);
//返回内核辅助信息
WebView.getCrashExtraMessage(Context context); 

1.15 JS自动弹窗提示

在非用户操作情况下利用window.open打开窗口被称为自动弹窗,该功能默认关闭,如果开启可以使用如下接口:

mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

当关闭自动弹窗功能后,如果想在自动弹出时收到内核的提示并进行处理,需要按如下设置:

//关闭自动弹窗(默认是关闭的)
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
//设置自动弹窗被拦截时提醒(回调接口)
mWebView.getSettingsExtension().setJavaScriptOpenWindowsBlockedNotifyEnabled(true); 
//回调的接口需要如下设置:
mWebView.getX5WebViewExtension().setWebViewClientExtension(new ProxyWebViewClientExtension() {
    @Override
    public boolean notifyJavaScriptOpenWindowsBlocked(
        String host, 
        String[] blockedUrlList,
        ValueCallback<Boolean> callback, 
        boolean hadAllowShow) {
        //在此可以弹框提示用户
        //只允许当前一次调用callback.onReceiveValue(false)
        //如果后续都允许调用callback.onReceiveValue(true)
        return true;
    }
});

接口说明如下:

/**
* 当js在非用户操作下打开新页面被内核拦截且宿主也不允许当前页面自动打开时,对应页面会被内核阻止 
* 如果在IX5WebSettingsExtension设置了setJavaScriptOpenWindowsBlockedNotifyEnabled为true时
* 此时会回调宿主当前拦截的所有页面是否允许被打开
* 如果callback回调true,后续对应页面的弹窗再被拦截时则会直接按照此授权处理,不再回调该接口通知宿主
* 如果callback回调false,页面下次弹出窗口被拦截仍会通知宿主,但此时hadAllowShow的值为true
* @param host页面域名
* @param blockedUrlList 被阻止打开的页面url列表
* @param callback true:打开拦截页面且后续不再拦截,false:打开宿主页面后续继续拦截,如果已经做过该操作,则后续回调接口中hadAllowShow为true
* @param hadAllowShow 是否允许展示过该host的弹出窗口,当曾经设置过callback<false>时该值为true,否则为false
* @return 宿主处理了该接口返回true,否则返回false
*/
public boolean notifyJavaScriptOpenWindowsBlocked(
    String host, 
    String[] blockedUrlList, 
    ValueCallback<Boolean> callback,
    boolean hadAllowShow
);

1.16 H5全屏

当页面通过js请求全屏、退出全屏时内核会回调onShowCustomView、onHideCustomView接口,外部按照如下适配即可

mWebView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onShowCustomView(View view,IX5WebChromeClient.CustomViewCallback callback) {

    }

    @Override
    public void onHideCustomView() {

    } 
}

1.17 缩放比例记录与恢复

缩放比例记录与恢复是基于域名的,首先要开启对应开关功能:

mWebView.getSettingsExtension().setAutoRecoredAndRestoreScaleEnabled(true);

当每次首次记录一个域名的缩放比例时会回调这个接口

mWebView.setWebViewClientExtension(new ProxyWebViewClientExtension() {
   @Override
   public void onPromptScaleSaved() {

   }
});

1.18 获取页面Favicon

设置client监听页面Favicon回调

mWebView.setWebChromeClient(new WebChromeClient() {
  @Override
  public void onReceivedIcon(WebView view, android.graphics.Bitmap icon){
       //这里对favicon进行操作
  }
}

2 设置类

2.1 文字大小

// textZoom:100表示正常,120表示文字放大1.2倍
mWebView.getSettings().setTextZoom(int textZoom);
//该方法可以获取当前文字大小
mWebView.getSettings().getTextZoom(); 

2.2 设置UA

//设置当前ua
mWebView.getSettings().setUserAgentString(String ua);
//获取当前ua
mWebView.getSettings().getUserAgentString();

2.3 无图模式

方法一:

mWebView.getSettings().setLoadsImagesAutomatically(boolean enable);
mWebView.getSettings().setBlockNetworkImage(boolean enable);

有图:正常加载显示所有图片

mWebView.getSettings().setLoadsImagesAutomatically(true)
mWebView.getSettings().setBlockNetworkImage(false)

始终无图:所有图片都不显示

mWebView.getSettings().setLoadsImagesAutomatically(false)
mWebView.getSettings().setBlockNetworkImage(true)

注:如果是先加载的网页图片,后设置的始终无图,则已加载的图片正常显示

数据网络无图

mWebView.getSettings().setLoadsImagesAutomatically(true)
mWebView.getSettings().setBlockNetworkImage(true)

注:wifi网络,与有图模式一致;数据网络下,已经下载到缓存的图片正常显示,未下载到缓存的图片不去网络请求显示。

方法二:(新版sdk新加接口,如果在用的sdk中没有该接口需要更新sdk) 设置接口如下:

mWebView.getSettingsExtension().setPicModel(model);//其中model位于IX5WebSettingsExtension中

有图:model设置为IX5WebSettingsExtension.PicModel_NORMAL正常加载显示所有图片; 始终无图:model设置为IX5WebSettingsExtension.PicModel_NoPic不再显示图片(包括已加载出的图片); 数据网络无图:model设置为IX5WebSettingsExtension.PicModel_NetNoPic数据网络下无图(已加载的图片正常显示);

2.4 夜间模式

// enable:true(日间模式),enable:false(夜间模式)
mWebView.getSettingsExtension().setDayOrNight(eanble);

2.5 form保存及自动填充

// 是否记录并提示用户填充对应form元素,内核默认是true
mWebView.getSettings().setSaveFormData(enable);

2.6 设置网页背景色

在网页未设置背景色的情况下设置网页默认背景色

mWebView.setBackgroundColor(int color);

2.7 前进后退缓存

开启后前进后退将不再重新加载页面,默认关闭,开启方法如下:

mWebView.getSettingsExtension().setContentCacheEnable(true);

2.8 强制缩放

对于无法缩放的页面当用户双指缩放时会提示强制缩放,再次操作将触发缩放功能

mWebView.getSettingsExtension().setForcePinchScaleEnabled(true);

2.9 无痕模式

mWebView.getSettingsExtension().setShouldTrackVisitedLinks(enable);

开启无痕enable:false,关闭无痕开启enable:true

2.10 刘海屏适配

// 对于刘海屏机器如果webview被遮挡会自动padding
mWebView.getSettingsExtension().setDisplayCutoutEnable(true);