투케이2K

111. (TWOK/UTIL) [Android/kotlin] C_MoveApp - 외부 앱 실행 , 스키마 실행 , 마켓 이동 , 크롬 기반 외부 링크 이동 본문

투케이2K 유틸파일

111. (TWOK/UTIL) [Android/kotlin] C_MoveApp - 외부 앱 실행 , 스키마 실행 , 마켓 이동 , 크롬 기반 외부 링크 이동

투케이2K 2022. 12. 15. 10:20

[설 명]

프로그램 : Android / Kotlin

설 명 : C_MoveApp - 외부 앱 실행 , 스키마 실행 , 마켓 이동 , 크롬 기반 외부 링크 이동

 

[소스 코드]

 

package com.example.kotlinproject

import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.util.Log

class C_MoveApp {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 외부 링크 및 외부 앱 이동 클래스
     * 2. 외부 앱 실행 , 스키마 실행 , 앱 설치 여부 , 마켓 이동 , 크롬 기반 외부 링크 이동
     * // -----------------------------------------
     * */





    // TODO [빠른 로직 찾기 : 주석 로직 찾기]
    /**
     * // -----------------------------------------
     * // [SEARCH FAST] : [goAppRunLaunch] : 외부 앱이 설치되어 있으면 메인 실행, 아니면 마켓이동 실시
     * // -----------------------------------------
     * // [SEARCH FAST] : [goAppSchemeMoveLaunch] : 외부 앱이 설치되어 있으면 스키마 실행, 아니면 마켓이동 실시
     * // -----------------------------------------
     * // [SEARCH FAST] : [goChromeBrowser] : 크롬 브라우저 사용해 외부 링크 이동 실시
     * // -----------------------------------------
     * // [SEARCH FAST] : [goMarketRun] : 마켓이동 실시 메소드
     * // -----------------------------------------
     */





    // TODO [companion object >> static 선언 실시]
    companion object {


        // 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")
            }
        }





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

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


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


            // [사전 스키마 널 여부 체크]
            if (C_Util.stringNotNull(scheme) == true){
            }
            else { // [패키지 명이 널인 경우]
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goAppSchemeMoveLaunch() :: 외부 앱 스키마 실행 및 마켓 이동 실시 [외부 열기 실패]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ "스키마 null 널 임" +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[packageNames :: "+ scheme +"]")
                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 >> goAppSchemeMoveLaunch() :: 외부 앱 스키마 실행 및 마켓 이동 실시 [외부 앱 스키마 열기]]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[scheme :: "+ scheme +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[상 태 :: "+ "외부 앱 설치 됨" +"]")
                    Log.w("//===========//","================================================")
                    Log.i("---","---" + "\n")

                    // [형식] : testScheme://testHost?name=kwon&idno=1234
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(scheme))
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                    mContext.startActivity(intent)
                }
                else { // [설치되지 않은 경우]
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_MoveApp >> goAppSchemeMoveLaunch() :: 외부 앱 스키마 실행 및 마켓 이동 실시 [마켓 이동]]")
                    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 >> goAppSchemeMoveLaunch() :: 외부 앱 스키마 실행 및 마켓 이동 실시 [마켓 이동]]")
                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 >> goAppSchemeMoveLaunch() :: 외부 앱 스키마 실행 및 마켓 이동 실시 [에러 발생]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ e.message +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")
            }
        }





        // TODO [SEARCH FAST] : [goChromeBrowser] : 크롬 브라우저 사용해 외부 링크 이동 실시
        fun goChromeBrowser(mContext: Context, url: String) {

            /**
             * // -----------------------------------------
             * [goChromeBrowser 메소드 설명]
             * // -----------------------------------------
             * 1. 크롬 브라우저 사용해 외부 링크 이동 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_MoveApp.goChromeBrowser(this@A_Intro, "https://www.naver.com")
             * // -----------------------------------------
             * 3. 로 직 : 크롬 앱이 설치된 경우 크롬 브라우저 외부 링크 이동 / 아니면 기본 URL 외부 링크 이동 실시
             * // -----------------------------------------
             * 4. TODO [중요] AndroidManifest.xml 파일에서 queries >> package 등록 필요 (com.android.chrome)
             * // -----------------------------------------
             * */


            // [URL 주소 공백 제거 실시]
            val urlData = url.replace(" ","")


            // [사전 주소 널 여부 체크]
            if (C_Util.stringNotNull(urlData) == true){
            }
            else { // [패키지 명이 널인 경우]
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goChromeBrowser() :: 크롬 브라우저 사용해 외부 링크 이동 실시]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ "주소 null 널 임" +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[url :: "+ urlData +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")
                return
            }


            // [사전 주소 http 시작 체크]
            if (urlData.startsWith("http://") == true || urlData.startsWith("https://") == true){
            }
            else { // [패키지 명이 널인 경우]
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goChromeBrowser() :: 크롬 브라우저 사용해 외부 링크 이동 실시]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ "주소 http 시작 아님" +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[url :: "+ urlData +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")
                return
            }


            // [외부앱이 설치되었는지 확인]
            try {

                // [크롬 특정 패키지 명 변수 선언]
                val packageNames = "com.android.chrome"


                // [특정 패키지 명이 앱에 설치 되어 있는지 확인]
                val existPackage = mContext.packageManager.getLaunchIntentForPackage(packageNames)
                if (existPackage != null) { // [설치되어 있는 경우]
                    Log.i("---","---" + "\n")
                    Log.w("//===========//","================================================")
                    Log.i("","\n"+"[C_MoveApp >> goChromeBrowser() :: 크롬 브라우저 사용해 외부 링크 이동 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[url :: "+ urlData +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[상 태 :: "+ "크롬 설치 됨" +"]")
                    Log.w("//===========//","================================================")
                    Log.i("---","---" + "\n")

                    // [크롬 브라우저를 통해 외부 링크 호출]
                    val intent = Intent(Intent.ACTION_VIEW)
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                    intent.setPackage(packageNames) // [크롬 브라우저 지정]
                    intent.data = Uri.parse(urlData) // [공백 제거]
                    mContext.startActivity(intent)
                }
                else { // [설치되지 않은 경우]
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_MoveApp >> goChromeBrowser() :: 크롬 브라우저 사용해 외부 링크 이동 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[url :: "+ urlData +"]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[상 태 :: "+ "getLaunchIntentForPackage Is Null >> 크롬 설치 안됨 >> 일반 브라우저 사용 링크 이동" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")

                    // [일반 브라우저 외부링크 이동 실시]
                    val go = Intent(Intent.ACTION_VIEW)
                    go.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                    go.data = Uri.parse(urlData) // [공백 제거]
                    mContext.startActivity(go)
                }
            }
            catch (e: ActivityNotFoundException) {
                // [이동할 패키지 명을 찾이 못한 경우]
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goChromeBrowser() :: 크롬 브라우저 사용해 외부 링크 이동 실시]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[url :: "+ urlData +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[상 태 :: "+ "ActivityNotFoundException >> 크롬 설치 안됨 >> 일반 브라우저 사용 링크 이동" +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")

                // [일반 브라우저 외부링크 이동 실시]
                val go = Intent(Intent.ACTION_VIEW)
                go.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                go.data = Uri.parse(urlData) // [공백 제거]
                mContext.startActivity(go)
            }
            catch (e: Exception) {
                Log.i("---","---" + "\n")
                Log.e("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goChromeBrowser() :: 크롬 브라우저 사용해 외부 링크 이동 실시 [에러 발생]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ e.message +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[url :: "+ urlData +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[상 태 :: "+ "일반 브라우저 사용 링크 이동" +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")

                // [일반 브라우저 외부링크 이동 실시]
                val go = Intent(Intent.ACTION_VIEW)
                go.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                go.data = Uri.parse(urlData) // [공백 제거]
                mContext.startActivity(go)
            }
        }





        // TODO [SEARCH FAST] : [goMarketRun] : 마켓이동 실시 메소드
        fun goMarketRun(mContext: Context, packageNames: String) {

            /**
             * // -----------------------------------------
             * [goMarketRun 메소드 설명]
             * // -----------------------------------------
             * 1. 패키지 명을 사용해 구글 플레이스토어 마켓 이동 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_MoveApp.goMarketRun(this@A_Intro, "com.test.app")
             * // -----------------------------------------
             * */


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


            // [로직 처리 실시]
            try {
                Log.i("---","---" + "\n")
                Log.w("//===========//","================================================")
                Log.i("","\n"+"[C_MoveApp >> goMarketRun() :: 앱 마켓 이동 실시 [수행]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                Log.w("//===========//","================================================")
                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 >> goMarketRun() :: 앱 마켓 이동 실시 [에러]]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[error :: "+ e.message +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[packageNames :: "+ packageNames +"]")
                Log.i("","\n"+"-----------------------------------------")
                Log.i("","\n"+"[로 직 :: "+ "http 주소로 마켓 이동 실시" +"]")
                Log.e("//===========//","================================================")
                Log.i("---","---" + "\n")

                // [구글 플레이스토어 앱이 없을 경우 홈페이지에서 이동한다]
                val marketLaunch = Intent(Intent.ACTION_VIEW)
                marketLaunch.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                marketLaunch.data = Uri.parse("https://play.google.com/store/apps/details?id=$packageNames")
                mContext.startActivity(marketLaunch)
            }
        }

    } // [companion 종료]


} // TODO [클래스 종료]

 


반응형
Comments