Я создал очень простое приложение для веб-просмотра, которое показывает страницу. На этой странице некоторые JS звонят window.open
и, в конечном итоге, window.close
, чтобы открыть социальный логин и закрыть его по завершении.
Когда происходит звонок window.open
, веб-просмотр не заметно появляются. Я основал это на других SO вопросах по этой теме, но не могу заставить его работать.
Вот мой код:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Get the web view settings instance
val settings = webView.settings
// Enable and setup web view cache
settings.setAppCacheEnabled(true)
settings.cacheMode = WebSettings.LOAD_DEFAULT
settings.setAppCachePath(cacheDir.path)
// Enable zooming in web view
settings.setSupportZoom(true)
settings.builtInZoomControls = true
settings.displayZoomControls = true
// Enable safe browsing if possible
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
settings.safeBrowsingEnabled = true // api 26
}
// Enable hardware acceleration
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
// Important for popup windows to work
settings.javaScriptCanOpenWindowsAutomatically = true
settings.domStorageEnabled = true
settings.javaScriptEnabled = true
settings.loadsImagesAutomatically = true
settings.blockNetworkImage = false
settings.setSupportMultipleWindows(true)
// Set web view client
val webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
view?.loadUrl(url)
return true
}
}
webView.webViewClient = webViewClient
webView.webChromeClient = object: WebChromeClient() {
override fun onCreateWindow(
view: WebView?,
isDialog: Boolean,
isUserGesture: Boolean,
resultMsg: Message?
): Boolean {
val newWebView = WebView(this@MainActivity)
newWebView.settings.javaScriptEnabled = true
newWebView.settings.setSupportMultipleWindows(true)
newWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
view?.loadUrl(url)
return true
}
}
view?.addView(newWebView)
view?.bringChildToFront(newWebView)
newWebView.visibility = View.VISIBLE
val transport = resultMsg?.obj as WebView.WebViewTransport
transport.webView = newWebView
resultMsg?.sendToTarget()
return true
}
override fun onCloseWindow(window: WebView?) {
val parent = window?.parent as WebView
parent.removeView(window)
}
}
webView.loadUrl(url)
}