반응형
배경:
안드로이드 앱에서 웹뷰구현시에 다른앱으로 호출해야 하는 경우가 있다.
문제점:
웹뷰내에서 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
}
}
참고자료:
반응형
'안드로이드' 카테고리의 다른 글
[Android] Anroid local html 불러오기 (assets/www/MyHome.html 호출) (2/3) (0) | 2021.09.29 |
---|---|
[Android] Anroid local html 불러오기 (javaScript onclick 구현) (1/3) (0) | 2021.09.29 |
[Android] 웹뷰(webview) ShouldOverrideUrlLoading을 이용하여 응용 프로그램이 제어할 수 있는 기회를 처리 방법(url scheme) (0) | 2021.09.29 |
[Android] 웹뷰 webview window.open 처리 (웹뷰 고급편) (8) | 2021.09.29 |
[Android] 하이브리드 앱 만들기 (기본편)Hybrid webview default (0) | 2021.09.29 |