투케이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
            // ----------------------------------
        }

 

반응형
Comments