Notice
Recent Posts
Recent Comments
Link
투케이2K
343. (kotlin/코틀린) [Android 13] shouldOverrideUrlLoading 실시간 웹뷰 로드 URL 주소 변경 감지 본문
Kotlin
343. (kotlin/코틀린) [Android 13] shouldOverrideUrlLoading 실시간 웹뷰 로드 URL 주소 변경 감지
투케이2K 2023. 7. 9. 21:50[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : Kotlin
[소스 코드]
// [새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌]
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
S_Log._W_(S_FinalMsg.LOG_Status_Change, arrayOf("URL :: " + view.url.toString(), "설 명 :: " + "새로운 URL 이 웹뷰에 로드 수행"))
// TODO [intent 딥링크 스키마 확인 실시]
if (url.startsWith("intent") && url.toLowerCase().contains("package")) {
var intent: Intent? = null
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME) // 딥링크 스키마 확인
val packgeName = intent.getPackage().toString() // 스키마에 포함된 패키지명 확인
// [스키마에 포함된 패키지 명이 널이 아닌 경우]
if (C_Util.stringNotNull(packgeName) === true) {
val existPackage = this@A_Webview.packageManager.getLaunchIntentForPackage(intent.getPackage()!!)
if (existPackage != null) {
S_Log._W_("스키마 외부 앱 이동 수행 실시", arrayOf(
"데이터 :: $url",
"패키지 명 :: $packgeName"
))
// [스키마 사용해 외부앱 이동 수행 실시]
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
startActivity(intent)
} else {
S_Log._E_("스키마 외부 앱 이동 수행 실패", arrayOf(
"ERROR :: " + "설치 된 앱 없음 >> 마켓 이동 수행",
"패키지 명 :: $packgeName"
))
// [마켓 이동 수행 실시]
C_MoveApp.goMarketRun(this@A_Webview, packgeName)
}
} else {
S_Log._E_("스키마 외부 앱 이동 수행 실패", arrayOf(
"ERROR :: " + "패키지 명칭 IS NULL",
"패키지 명 :: $packgeName"
))
}
} catch (e: URISyntaxException) {
// [URI 문법 오류 시 처리 구간]
S_Log._E_("스키마 외부 앱 이동 수행 실패", arrayOf(
"ERROR :: " + "[URISyntaxException] :: Intent URL Scheme 문법 오류 발생",
"MESSAGE :: " + e.message.toString()
))
} catch (e: ActivityNotFoundException) {
// [인텐트 이동을 수행할 앱을 발견하지 못한 경우]
val packageName = intent!!.getPackage().toString()
// [패키지 명이 널이 아닌 경우]
if (C_Util.stringNotNull(packageName) === true) {
S_Log._E_("스키마 외부 앱 이동 수행 실패", arrayOf(
"ERROR :: " + "[ActivityNotFoundException] :: 인텐트 이동을 수행할 앱을 발견하지 못함",
"패키지 명 :: $packageName",
"로 직 :: " + "앱 설치 마켓 이동 수행"
))
// [마켓 이동 수행 실시]
C_MoveApp.goMarketRun(this@A_Webview, packageName)
} else {
S_Log._E_("스키마 외부 앱 이동 수행 실패", arrayOf(
"ERROR :: " + "[ActivityNotFoundException] :: 인텐트 이동을 수행할 앱을 발견하지 못함",
"패키지 명 :: $packageName",
"설 명 :: " + "패키지 명칭 IS NULL"
))
}
}
// ----------------------------------
// [return 값을 반드시 true 설정]
return true
// ----------------------------------
}
// TODO [SMS 인텐트 이동 실시 : if(url.startsWith("sms:010-5678-1234")]
if (url.startsWith("sms:")) {
// ----------------------------------
S_Log._W_("문자 이동 수행 실시", arrayOf("URL :: $url"))
// ----------------------------------
C_Intent.goSmsIntent(this@A_Webview, url) // [sms 이동 메소드 호출]
// ----------------------------------
// [return 값을 반드시 true 설정]
return true
// ----------------------------------
}
// TODO [전화 다이얼 인텐트 이동 실시 : if(url.startsWith("tel:010-1234-5678")]
if (url.startsWith("tel:")) {
// ----------------------------------
S_Log._W_("전화 다이얼 이동 수행 실시", arrayOf("URL :: $url"))
// ----------------------------------
C_Intent.goTelIntent(this@A_Webview, url) // [전화 다이얼 이동 메소드 호출]
// ----------------------------------
// [return 값을 반드시 true 설정]
return true
// ----------------------------------
}
// TODO [Mail (Gmail) 인텐트 이동 실시 : if(url.startsWith("mailto:honggildung@test.com?subject=tittle&body=content")]
if (url.startsWith("mailto:")) {
// ----------------------------------
S_Log._W_("메일 이동 수행 실시", arrayOf("URL :: $url"))
// ----------------------------------
C_Intent.goMailIntent(this@A_Webview, url) // [메일 이동 메소드 호출]
// ----------------------------------
// [return 값을 반드시 true 설정]
return true
// ----------------------------------
}
// TODO [하이퍼링크 이동 실시 : if(url.startsWith("l:https://naver.com")]
if (url.startsWith("l:")) {
// ----------------------------------
S_Log._W_("외부 링크 이동 수행 실시", arrayOf("URL :: $url"))
// ----------------------------------
C_Intent.goLinkIntent(this@A_Webview, url) // [하이퍼링크 이동 메소드 호출]
// ----------------------------------
// [return 값을 반드시 true 설정]
return true
// ----------------------------------
}
// ----------------------------------
// [새로운 웹뷰 로드 수행]
view.loadUrl(url)
// ----------------------------------
// ----------------------------------
// [return 값을 반드시 false 설정]
return false
// ----------------------------------
}
반응형
'Kotlin' 카테고리의 다른 글
Comments