투케이2K

426. (android/kotlin) [android 12 / target 31] 외부 앱 열기 및 스키마 이동 Intent getLaunchIntentForPackage 대응 본문

Android

426. (android/kotlin) [android 12 / target 31] 외부 앱 열기 및 스키마 이동 Intent getLaunchIntentForPackage 대응

투케이2K 2022. 12. 15. 09:27

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[요약 설명]

1. 외부 앱 열기 및 스키마 이동 시 AndroidManifest.xml 파일에 queries >> package 등록 필요

2. getLaunchIntentForPackage 사용해 ActivityNotFoundException 체크 및 외부 앱 열기 , 구글 플레이스토어 마켓 이동 수행

 

[AndroidManifest.xml : 소스 코드]

    <!-- 외부앱 설치 확인 및 외부앱 열기 패키지 선언 부분 -->
    <queries>
        <!-- [기본 크롬] -->
        <package android:name="com.android.chrome" /> <!-- [크롬] -->

        <!-- [카카오톡 링크 연동] -->
        <package android:name="com.kakao.talk" /> <!-- [카카오톡] -->
    </queries>
 

[Kotlin : 소스 코드]

 

        // TODO [SEARCH FAST] : [goAppRunLaunch] : 외부 앱이 설치되어 있으면 메인 실행, 아니면 마켓이동 실시
        fun goAppRunLaunch(mContext: Context, packageNames: String) {

            /**
             * // -----------------------------------------
             * [goAppRunLaunch 메소드 설명]
             * // -----------------------------------------
             * 1. getLaunchIntentForPackage 사용해 외부앱 설치 여부 확인 및 외부앱 실행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_MoveApp.goAppRunLaunch(this@A_Intro, "com.test.app")
             * // -----------------------------------------
             * 3. 로 직 : 외부앱이 설치되지 않은 경우 앱 설치 진행 / 설치된 경우 외부앱 실행 실시
             * // -----------------------------------------
             * 4. TODO [중요] AndroidManifest.xml 파일에서 queries >> package 등록 필요
             * // -----------------------------------------
             * */


            // [사전 패키지 명 널 여부 체크]
            if (C_Util.stringNotNull(packageNames) == true){
            }
            else { // [패키지 명이 널인 경우]
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goAppRunLaunch() :: 외부 앱 실행 및 마켓 이동 실시 [외부 열기 실패]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ "패키지 명 null 널 임" +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")
                return
            }


            // [외부앱이 설치되었는지 확인]
            try {
                // [특정 패키지 명이 앱에 설치 되어 있는지 확인]
                val existPackage = mContext.packageManager.getLaunchIntentForPackage(packageNames)
                if (existPackage != null) { // [설치되어 있는 경우]
                    Log.i("---","---" + "\n")
                    Log.w("//===========//","================================================")
                    Log.i("","\n"+"[C_MoveApp >> goAppRunLaunch() :: 외부 앱 실행 및 마켓 이동 실시 [외부 열기]]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[상 태 :: "+ "외부 앱 설치 됨" +"]")
                    Log.w("//===========//","================================================")
                    Log.i("---","---" + "\n")

                    // [인텐트 이동]
                    val intent = mContext.packageManager.getLaunchIntentForPackage(packageNames)
                    intent!!.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                    mContext.startActivity(intent)
                }
                else { // [설치되지 않은 경우]
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_MoveApp >> goAppRunLaunch() :: 외부 앱 실행 및 마켓 이동 실시 [마켓 이동]]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[상 태 :: "+ "getLaunchIntentForPackage Is Null >> 외부 앱 설치 안됨" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")

                    // [구글 플레이스토어 이동]
                    val marketLaunch = Intent(Intent.ACTION_VIEW)
                    marketLaunch.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                    marketLaunch.data = Uri.parse("market://details?id=$packageNames")
                    mContext.startActivity(marketLaunch)
                }
            }
            catch (e: ActivityNotFoundException) {
                // [이동할 패키지 명을 찾이 못한 경우]
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goAppRunLaunch() :: 외부 앱 실행 및 마켓 이동 실시 [마켓 이동]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[상 태 :: "+ "ActivityNotFoundException >> 외부 앱 설치 안됨" +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")

                // [구글 플레이스토어 이동]
                val marketLaunch = Intent(Intent.ACTION_VIEW)
                marketLaunch.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                marketLaunch.data = Uri.parse("market://details?id=$packageNames")
                mContext.startActivity(marketLaunch)
            }
            catch (e: Exception) {
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goAppRunLaunch() :: 외부 앱 실행 및 마켓 이동 실시 [에러 발생]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ e.message +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")
            }
        }

 

반응형
Comments