文章目录
摘要
文章主要分2部分:
- Webview的基础相关知识:如调试、基础API、和原生交互等
- Androidx-WebKit 的使用: 如和原生的消息交互、文件传递、以及启动安全浏览等
WebView基础
一、启动调整模式
在开发过程中,我们可以启用 WebView 的调试模式,以便在 Chrome DevTools 中查看 WebView 的内容、网络请求等信息。
WebView.setWebContentsDebuggingEnabled(true)
调试界面 chrome://inspect/#devices
二、WebChromeClient
WebChromeClient 是一个抽象基类,它的实例可以被传递给 WebView.setWebChromeClient() 方法,以处理与 JavaScript 交互和网页元素相关的事件。
2.1 WebChromeClient一进度相关
onProgressChanged(WebView view, int newProgress)
: 当页面加载进度改变时调用。newProgress参数表示当前页面加载的百分比。
2.2 WebChromeClient-标题、图标相关
onReceivedTitle(WebView view, String title)
: 当前页面的标题已经被接收到时调用。title参数是新的标题。onReceivedIcon(WebView view, Bitmap icon)
: 当前页面的图标已经被接收到时调用。icon参数是新的图标。onReceivedTouchIconUrl(WebView view, String url, boolean precomposed)
: 当网页的触摸图标URL被接收到时调用。url参数是图标的URL,precomposed参数表示图标是否已经被合成。
2.3 WebChromeClient-权限相关
onPermissionRequest(PermissionRequest request)
: 当网页请求一个权限时调用,例如摄像头、麦克风等。你可以在这个方法中处理权限请求。onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)
: 当网页请求获取地理位置权限时调用。origin参数是请求权限的网页的源,callback参数是用于设置权限的回调。
override fun onPermissionRequest(request: PermissionRequest?) {
"onPermissionRequest".logD(WEB_TAG)
try {
request?.let {
kotlin.runCatching {
if (isVideo(request.resources)) {
startRequestPermissions(permissions = arrayOf(permission.CAMERA, permission.RECORD_AUDIO)) {
if (it.filter {
!it.value }.isEmpty()) {
request.grant(request.resources)
request.origin
}
}
} else if (isOnlyAudio(request.resources)) {
startRequestPermission(permission = permission.RECORD_AUDIO) {
if (it) {
request.grant(request.resources)
request.origin
}
}
}
}
}
}catch (e :Exception){
e.message.logE(WEB_TAG)
}
}
private fun isVideo(resources: Array<String>): Boolean {
val strings = listOf(*resources)
return strings.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE)
}
private fun isOnlyAudio(resources: Array<String>): Boolean {
val strings = listOf(*resources)
return !strings.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE) && strings.contains(PermissionRequest.RESOURCE_AUDIO_CAPTURE)
}
}
2.4 WebChromeClient-文件处理
onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams)
: 当网页需要用户选择文件时调用,例如HTML的元素被点击时。你可以在这个方法中打开一个文件选择器,并将用户选择的文件的URI通过filePathCallback返回。
2.5 WebChromeClient-弹窗、JS相关
onJsAlert(WebView view, String url, String message, JsResult result)
: 当JavaScript的alert()函数被调用时调用。message参数是alert()函数的参数。onJsConfirm(WebView view, String url, String message, JsResult result)
: 当JavaScript的confirm()函数被调用时调用。message参数是confirm()函数的参数。onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResul