안드로이드
[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
}
}
참고자료:
반응형