WebViewClient:在影响View的事件到来时,会通过WebViewClient中的方法回调通知用户
WebChromeClient:当影响浏览器的事件到来时,就会通过WebChromeClient中的方法回调通知用法。
WebViewClient:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
LogUtils.i(TAG, "shouldOverrideUrlLoading ... Android N 过期");
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
LogUtils.i(TAG, "shouldOverrideUrlLoading ... 拦截超链接 ");
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
LogUtils.i(TAG, "onPageStarted ... 通知主程序页面开始加载 ");
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
LogUtils.i(TAG, "onPageFinished ... 通知主程序页面加载完成 ");
super.onPageFinished(view, url);
}
@Override
public void onLoadResource(WebView view, String url) {
LogUtils.i(TAG, "onLoadResource ... 通知主程序WebView将加载指定url的资源 ");
super.onLoadResource(view, url);
}
@Override
public void onPageCommitVisible(WebView view, String url) {
LogUtils.i(TAG, "onPageCommitVisible ... HTTP的body标签加载前调用,仅在主frame调用 ");
super.onPageCommitVisible(view, url);
}
@androidx.annotation.Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
LogUtils.i(TAG, "shouldInterceptRequest ... 不推荐使用");
return super.shouldInterceptRequest(view, url);
}
@androidx.annotation.Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
LogUtils.i(TAG, "shouldInterceptRequest ... 通知主程序资源请求并可以返回资源数据 ");
return super.shouldInterceptRequest(view, request);
}
@Override
public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {
LogUtils.i(TAG, "shouldInterceptRequest ... 弃用 ");
super.onTooManyRedirects(view, cancelMsg, continueMsg);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
LogUtils.i(TAG, "onReceivedError ... 向主机应用程序报告错误 ");
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
LogUtils.i(TAG, "onReceivedError ... 向主机应用程序报告Web资源加载错误 ");
super.onReceivedError(view, request, error);
}
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
LogUtils.i(TAG, "onReceivedHttpError ... 通知主机应用程序在加载资源时从服务器接收到HTTP错误 ");
super.onReceivedHttpError(view, request, errorResponse);
}
@Override
public void onFormResubmission(WebView view, Message dontResend, Message resend) {
LogUtils.i(TAG, "onFormResubmission ... 当浏览器重新提交表单调用,默认是不会重新发送的 ");
super.onFormResubmission(view, dontResend, resend);
}
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
LogUtils.i(TAG, "doUpdateVisitedHistory ... 通知主程序更新浏览记录到数据库 ");
super.doUpdateVisitedHistory(view, url, isReload);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
LogUtils.i(TAG, "onReceivedSslError ... 通知主机应用程序在加载资源时发生SSL错误 ");
super.onReceivedSslError(view, handler, error);
}
@Override
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
LogUtils.i(TAG, "onReceivedClientCertRequest ... 通知主机应用程序处理SSL客户端证书请求。如果需要,主机应用程序负责显示UI并提供密钥 ");
super.onReceivedClientCertRequest(view, request);
}
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
LogUtils.i(TAG, "onReceivedHttpAuthRequest ... 通知主机应用程序WebView接收到HTTP身份验证请求 ");
super.onReceivedHttpAuthRequest(view, handler, host, realm);
}
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
LogUtils.i(TAG, "shouldOverrideKeyEvent ... 重写此方法才能够处理在浏览器中的按键事件 ");
return super.shouldOverrideKeyEvent(view, event);
}
@Override
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
LogUtils.i(TAG, "onUnhandledKeyEvent ... 提醒主机应用程序,除了系统按键外,WebView不处理其他按键操作 ");
super.onUnhandledKeyEvent(view, event);
}
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
LogUtils.i(TAG, "onScaleChanged ... 通知主机应用程序应用到WebVIEW的比例尺改变了 ");
super.onScaleChanged(view, oldScale, newScale);
}
@Override
public void onReceivedLoginRequest(WebView view, String realm, @androidx.annotation.Nullable String account, String args) {
LogUtils.i(TAG, "onReceivedLoginRequest ... 通知主机应用程序请求自动登录用户已被处理 ");
super.onReceivedLoginRequest(view, realm, account, args);
}
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
LogUtils.i(TAG, "onRenderProcessGone ... 通知宿主应用程序已经退出给定的WebVIEW的渲染过程 ");
return super.onRenderProcessGone(view, detail);
}
@Override
public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) {
LogUtils.i(TAG, "onReceivedLoginRequest ... 在Android 8.1中,定义应用程序如何响应已知的威胁 ");
super.onSafeBrowsingHit(view, request, threatType, callback);
}
});
WebChromeClient :
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
LogUtils.i(TAG, "onProgressChanged ... 通知主程序当前加载页面进度 ");
super.onProgressChanged(view, newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
LogUtils.i(TAG, "onReceivedTitle ... 获取到标题 ");
super.onReceivedTitle(view, title);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
LogUtils.i(TAG, "onReceivedIcon ... 获取到主界面icon");
super.onReceivedIcon(view, icon);
}
@Override
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) {
LogUtils.i(TAG, "onReceivedTouchIconUrl ... 通知主程序的apple-touch-icon的url。apple-touch-icon用于给苹果设备生成桌面快捷方式。 ");
super.onReceivedTouchIconUrl(view, url, precomposed);
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
LogUtils.i(TAG, "onShowCustomView ... 通知主机应用程序当前页面已进入全屏模式 ");
super.onShowCustomView(view, callback);
}
@Override
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
LogUtils.i(TAG, "onShowCustomView ... 通知主机应用程序当前页面已进入全屏模式 ");
super.onShowCustomView(view, requestedOrientation, callback);
}
@Override
public void onHideCustomView() {
LogUtils.i(TAG, "onHideCustomView ... 通知主程序当前页面已经退出全屏模式。主程序需要隐藏自定义view。 ");
super.onHideCustomView();
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
LogUtils.i(TAG, "onCreateWindow ... 请求主机应用程序创建一个新窗口 ");
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
@Override
public void onRequestFocus(WebView view) {
LogUtils.i(TAG, "onRequestFocus ... 此WebVIEW请求显示和焦点 ");
super.onRequestFocus(view);
}
@Override
public void onCloseWindow(WebView window) {
LogUtils.i(TAG, "onCloseWindow ... 通知主机应用程序关闭给定的WebVIEW,并在必要时从视图系统中删除它 ");
super.onCloseWindow(window);
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
LogUtils.i(TAG, "onJsAlert ... 对话框事件 1个按钮 ");
return super.onJsAlert(view, url, message, result);
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
LogUtils.i(TAG, "onJsAlert ... 对话框事件 2个按钮 ");
return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
LogUtils.i(TAG, "onJsAlert ... 对话框事件 提示类,没有按钮 ");
return super.onJsPrompt(view, url, message, defaultValue, result);
}
@Override
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
LogUtils.i(TAG, "onJsBeforeUnload ... 告诉客户端显示一个对话框以确认导航离开当前页面 ");
return super.onJsBeforeUnload(view, url, message, result);
}
@Override
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater) {
LogUtils.i(TAG, "onExceededDatabaseQuota ... 19弃用 ");
super.onExceededDatabaseQuota(url, databaseIdentifier, quota, estimatedDatabaseSize, totalQuota, quotaUpdater);
}
@Override
public void onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater) {
LogUtils.i(TAG, "onReachedMaxAppCacheSize ... 19弃用 ");
super.onReachedMaxAppCacheSize(requiredStorage, quota, quotaUpdater);
}
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
LogUtils.i(TAG, "onGeolocationPermissionsShowPrompt ... 通知主机应用程序,来自指定来源的Web内容试图使用地理定位API,但目前没有为该源设置许可状态。 ");
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
@Override
public void onGeolocationPermissionsHidePrompt() {
LogUtils.i(TAG, "onGeolocationPermissionsHidePrompt ... 如果上面那个权限取消会调用这个,因为没有权限,所以相关ui应该被隐藏 ");
super.onGeolocationPermissionsHidePrompt();
}
@Override
public void onPermissionRequest(PermissionRequest request) {
LogUtils.i(TAG, "onPermissionRequest ... 通知主机应用程序Web内容请求访问指定资源的权限,并且当前未授予或拒绝权限 ");
super.onPermissionRequest(request);
}
@Override
public void onPermissionRequestCanceled(PermissionRequest request) {
LogUtils.i(TAG, "onPermissionRequestCanceled ... 通知主程序权限请求被取消。相关ui应该被隐藏 ");
super.onPermissionRequestCanceled(request);
}
@Override
public boolean onJsTimeout() {
LogUtils.i(TAG, "onJsTimeout ... 17弃用 ");
return super.onJsTimeout();
}
@Override
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
LogUtils.i(TAG, "onConsoleMessage ... 8弃用 ");
super.onConsoleMessage(message, lineNumber, sourceID);
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
LogUtils.i(TAG, "onConsoleMessage ... 将JavaScript的调试信息提交给主机应用 ");
return super.onConsoleMessage(consoleMessage);
}
@androidx.annotation.Nullable
@Override
public Bitmap getDefaultVideoPoster() {
LogUtils.i(TAG, "getDefaultVideoPoster ... 当不播放时,视频元素由'poster' 图像表示 ");
return super.getDefaultVideoPoster();
}
@androidx.annotation.Nullable
@Override
public View getVideoLoadingProgressView() {
LogUtils.i(TAG, "getVideoLoadingProgressView ... 获取在全屏视频正在缓冲的同时显示的视图 ");
return super.getVideoLoadingProgressView();
}
@Override
public void getVisitedHistory(ValueCallback<String[]> callback) {
LogUtils.i(TAG, "getVisitedHistory ... 获得所有访问历史项目的列表,用于链接着色 ");
super.getVisitedHistory(callback);
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
LogUtils.i(TAG, "onShowFileChooser ... 告诉客户端显示一个文件选择器 ");
return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
}
});
-
onShowFileChooser
可以用来选择图片等文件。
需要在回调中取出 ValueCallback<Uri[]> filePathCallback 对象。
在选择完文件的地址进行操作:
filePathCallback .onReceiveValue(new Uri[]{Uri.fromFile(new File(path))}); -
onReceivedTitle
可以从H5中获取到标题内容,也可以在此自定义标题 -
onJsAlert
-
onJsConfirm
-
onJsPrompt
弹窗类回调操作方法。
转载和参考地址
转载地址:Android WebView之WebViewClient和WebChromeClient
参考地址:WebChromeClient常用方法详解