DEV Community

myougaTheAxo
myougaTheAxo

Posted on • Originally published at zenn.dev

WebView Advanced Guide - JS Bridge, Cookies & File Downloads in Compose

WebView Advanced Guide

Accompanist WebView Integration

AndroidView(
    factory = { context ->
        WebView(context).apply {
            webViewClient = MyWebViewClient()
            addJavascriptInterface(MyJsInterface(), "Android")
        }
    }
)
Enter fullscreen mode Exit fullscreen mode

JavaScript Bridge

class MyJsInterface {
    @JavascriptInterface
    fun showToast(message: String) {
        // Called from JavaScript
    }
}

// Call from JS: Android.showToast("Hello")
Enter fullscreen mode Exit fullscreen mode

Evaluate JavaScript

webView.evaluateJavascript("document.title") { result ->
    Log.d("WebView", "Title: $result")
}
Enter fullscreen mode Exit fullscreen mode

WebViewClient Customization

class MyWebViewClient : WebViewClient() {
    override fun shouldOverrideUrlLoading(
        view: WebView?,
        request: WebResourceRequest?
    ): Boolean {
        return when (request?.url?.scheme) {
            "myapp" -> handleCustomScheme(request.url)
            else -> false
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

CookieManager

val cookieManager = CookieManager.getInstance()
cookieManager.setAcceptCookie(true)
cookieManager.setCookie(url, "session_id=123; Path=/")
Enter fullscreen mode Exit fullscreen mode

DownloadManager Integration

webView.setDownloadListener { url, _, contentDisposition, mimeType, _ ->
    val request = DownloadManager.Request(Uri.parse(url))
    request.setDestinationInExternalPublicDir(
        Environment.DIRECTORY_DOWNLOADS,
        URLUtil.guessFileName(url, contentDisposition, mimeType)
    )
    context.getSystemService<DownloadManager>()?.enqueue(request)
}
Enter fullscreen mode Exit fullscreen mode

8 Android app templates on Gumroad

Top comments (0)