每天记录学习的新知识 :WebViewClient和WebChromeClient 所有回调走一遍

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

  1. onSafeBrowsingHit
    android 8.1 添加的功能,可以编辑安全浏览操作。操作方法
  2. shouldOverrideUrlLoading
    此方法在POST请求不会调用,超链接调用

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

  1. onShowFileChooser
    可以用来选择图片等文件。
    需要在回调中取出 ValueCallback<Uri[]> filePathCallback 对象。
    在选择完文件的地址进行操作:
    filePathCallback .onReceiveValue(new Uri[]{Uri.fromFile(new File(path))});

  2. onReceivedTitle
    可以从H5中获取到标题内容,也可以在此自定义标题

  3. onJsAlert

  4. onJsConfirm

  5. onJsPrompt
    弹窗类回调操作方法。

转载和参考地址

转载地址:Android WebView之WebViewClient和WebChromeClient
参考地址:WebChromeClient常用方法详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风徐来辽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值