본문 바로가기
IT기술(코딩)/안드로이드스튜디오

안드로이드 스튜디오 앱에서 다른 앱 열기 안열릴때, 앱 있는데 안열릴때

by 크리에이트매이커 2021. 12. 6.
반응형

안녕하세요~ 여러분~~

 

오늘은 앱에서 다른앱 여는 코드를 볼껀데요~

사실 안드로이드 스튜디오에서 검색하면 방법은 다 나와있습니다.~ 하지만 제가 알려드리고 싶은건,

앱이 분명 내 폰에 있는데도 해당 코드를 사용했을때, 앱이 안켜지는 현상이 있다는 거에요.

 

예를들면 배민, 탄탄, 은행앱 등등 분면 내 폰에 앱이 깔려있는데, 구글이나 Developer에 있는 코드를 활용하면 안열리는 경우가 있는데요. 이를 위해 제가 공부한 부분을 알려드릴게요~ 물로 다른분의 제공한 코드를 바탕으로 작성한겁니다.

 

 //밑에 함수를 바탕으로 동작하는 코드
 
if(searchAppPackage(Choicedelivery.this,"com.sampleapp")==1){
                    LaunchApp(Choicedelivery.this, "com.sampleapp");
                    Log.d("TAG","Choicedelivery App is on the phone");
                }else{
                    GotoInstall(Choicedelivery.this,"com.sampleapp");
                    Log.d("TAG","Choicedelivery App is not on the phone");
                }
                Log.d("TAG","Choicedelivery App "+searchAppPackage(Choicedelivery.this,"com.sampleapp") );
                
            
// 해당앱이 내 폰에 깔려있는지 확인하는 함수
 public static int searchAppPackage(Context context, String packagename){
        int checkapp = 0;

        PackageManager PM = context.getPackageManager();
        List<ResolveInfo> applist;
        Intent intentgetapplist = new Intent(Intent.ACTION_MAIN, null);
        intentgetapplist.addCategory(Intent.CATEGORY_LAUNCHER);
        applist = PM.queryIntentActivities(intentgetapplist, 0 );

        try{
            for(int i =0; i< applist.size(); i++){
                if(applist.get(i).activityInfo.packageName.startsWith(packagename)){
                    checkapp = 1;
                    Log.d("TAG","Choicedelivery Check for");
                    break;
                }else{
                    Log.d("TAG","Choicedelivery Check for: " + applist.get(i));
                }
            }
        }catch (Exception e){
            checkapp = 2;
            Log.d("TAG","Choicedelivery error");
            e.printStackTrace();
        }

        return checkapp;
    }
    
//현재 앱에서 다른앱을 실행하는 함수
    public static void LaunchApp (Context context, String packagename){
        Intent launchapp = context.getPackageManager().getLaunchIntentForPackage(packagename);
        launchapp.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(launchapp);
    }

//실행하고자 하는 앱이 없을경우 구글플레이스토어에 설치 경로까지 가는 함수
    public static void GotoInstall (Context context, String pakagename ){
        String url = "market://details?id="+pakagename;
        Intent gotoplaystore = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        gotoplaystore.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(gotoplaystore);
    }

자 여기 코드를 보시면 함수 사용 시 packagename 부분에 제가 com.sampleapp 이라고 적었는데~ 이는 '배달의 민족' 실행 경로 입니다.

저렇게 하고 동작시키면, 제 폰에 배달의 민족 앱이 있음에도 켜지지 않고 설치창으로 넘어가게 됩니다.

그래서 저는 로그 자료를 분석한 결과,,

searchAppPackage 함수의

intentgetapplist.addCategory(Intent.CATEGORY_LAUNCHER);

이부분을 로그로 살펴 보았습니다. 저부분에서 제 폰의 모든앱의 intent-filter 관련된 정보를 수집하여

List에 넣는건데요. 

Log.d("TAG","Choicedelivery Check for: " + applist.get(i));

를 통해 살펴보니, com.sampleapp 이라는 배달의 민족 실행경로가 List에 저장이 안됬었습니다...

배문 뿐 아니라 깔려있는 앱중 없는 앱들이 꽤 있었습니다.

자료중 

2021-12-06 00:03:49.671 945-945/com.coin.whichfood D/TAG: Choicedelivery Check for: ResolveInfo{60a648b com.kakao.talk/.activity.SplashActivity m=0x108000}

처럼 com.kakao.talk 이 있는게 보여 카카오톡은 실행이 되나 테스트 해보니 잘 됐습니다.

 

즉,

intentgetapplist.addCategory(Intent.CATEGORY_LAUNCHER);

이 코드에서 내 폰의 모든 앱 중 정보를 담지 못한 앱이 있으면 그 앱은 실행이 되질 않습니다.

해당 Intent.CATAGORY_LAUNCHER 라는 인자중 Intent.CATAGORY_DEFAULT 라는 인자도 있는데, 이 인자를 사용하면 더 많은 앱 실행 경로를 List에 저장했지만, 여전히 배민 및 다른 몇몇 앱들의 실행 경로는 List 저장되지 않았습니다.

 

과연 어떤 인자를 사용해야 내 폰에 있는 모든 앱의 모든 실행 경로를 담을 수 있을까요?

지금 찾는중입니다.

반응형