안드로이드

[Android] Webview에서 URI_INTENT_SCHEME 오류

IT꿈나무 2021. 9. 29. 13:25
반응형

배경:

안드로이드 앱에서 웹뷰구현시에 다른앱으로 호출해야 하는 경우가 있다.

 

문제점:

웹뷰내에서 WebViewClient()를 개발자으 수작업으로 구현하여 상속 받은 경우에는 shouldOverrideUrlLoading()에서 url을 먼저 수신에서 다른 처리를 해줘야 한다. 단 WebViewClient()를 상속 받지 않은경우 기본 브라우저가 동작하여 URI_INTENT_SCHEME 오류가 발생하지 않는다.

 

구현방법:

           webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(
                    view: WebView?,
                    request: WebResourceRequest?
                ): Boolean {
//                    request!!.url.toString()
//                    showToast("URL.toString()"+request!!.url.toString())
//                    return super.shouldOverrideUrlLoading(view, request)

                    val intent = parse(request!!.url!!.toString())
                    return if (isIntent(request!!.url!!.toString())) {
                        if (isExistInfo(intent) or isExistPackage(intent))
                            start(intent)
                        else
                            gotoMarket(intent)
                    } else if (isMarket(request!!.url!!.toString()))
                        start(intent)
                    else
                        super.shouldOverrideUrlLoading(view, request)
                }

                private fun isIntent(url: String?) =
                    url?.matches(Regex("^intent:?\\w*://\\S+$")) ?: false

                private fun isMarket(url: String?) = url?.matches(Regex("^market://\\S+$")) ?: false

                private fun isExistInfo(intent: Intent?): Boolean {
                    return try {
                        intent != null && context.packageManager.getPackageInfo(
                            intent.`package`,
                            PackageManager.GET_ACTIVITIES
                        ) != null
                    } catch (e: PackageManager.NameNotFoundException) {
                        false
                    }

                }

                private fun isExistPackage(intent: Intent?): Boolean =
                    intent != null && context.packageManager.getLaunchIntentForPackage(intent.`package`.toString()) != null

                private fun parse(url: String): Intent? {
                    return try {
                        Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                    } catch (e: URISyntaxException) {
                        null
                    }

                }

                private fun start(intent: Intent?): Boolean {
                    intent?.let { context.startActivity(it) }
                    return true
                }

                private fun gotoMarket(intent: Intent?): Boolean {
                    intent?.let {
                        start(Intent(Intent.ACTION_VIEW).apply {
                            data = Uri.parse("market://details?id=${it.`package`}")
                        })
                    }
                    return true
                }
            }

 

참고자료:

[1] https://medium.com/@bootpay.co.kr/android-webview-err-unknown-url-scheme-%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC-84c9c3e69967

반응형