앱에서 기존에 설치되어있는 "연락처", "내 파일", "유튜브" 등등의 다른 앱들을 실행시켜서 보여줘야 하는 경우가 꽤 있습니다. 이번 글에서는 A(My App)  앱에서 B(External A...

[안드로이드] 외부 앱 실행하기

 

앱에서 기존에 설치되어있는 "연락처", "내 파일", "유튜브" 등등의 다른 앱들을

실행시켜서 보여줘야 하는 경우가 꽤 있습니다.

이번 글에서는 A(My App)  앱에서 B(External App) 앱을 실행시키는 동작을 정리하려고 합니다.


 

 

 

 

1. Package name 확인

앱 마다 고유의 package name 을 가지고 있습니다.

외부 앱을 실행시키기 위해서 package name 을 알아야 합니다.

여러가지 방법이 있겠지만 저는 Package name viewer 라는 앱을 활용하여 확인하였습니다.


 

 

혹시 앱을 따로 설치하는걸 원치 않으시면 

아래 Google Play Store 에서도 앱 검색 후 id 를 통해 확인이 가능합니다.

구글플레이스토어

 



 

 

2. queris

Android 11 (API 30) 이상에서 외부 앱과 상호작용을 위해서는

AndroidManifest 에 아래와 같이 Package name 과 함께 queris 를 선언해줘야 합니다.

<application

....

</application>

<queries>
<package android:name="com.google.android.gm" /> <!-- Gmail -->
<package android:name="com.google.android.youtube" /> <!-- Youtube -->
</queries>

 

query 선언하는 이유

보안 상의 이유로 설치된 모든 앱에 대해 감지할 수 없다고 합니다.

자세한 내용은 아래 링크를 확인 해주세요!

Android Developer : Android에서 패키지 공개 상태 필터링

 

 

 

 

3. 외부 앱 실행하기

고유의 패키지 명과 쿼리 선언을 통해 패키지 공개 상태 확대까지 되었다면 모든 준비 완료!

아래 메서드를 활용하여 원하는 외부 앱을 실행 시켜 줄 수 있습니다.

private fun isInstalledExternalApp(context: Context, packageName: String): Boolean {
var isInstalled = false
val mainIntent = Intent(Intent.ACTION_MAIN, null)
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER)
val packageManager = context.packageManager
val installedApps = packageManager.queryIntentActivities(mainIntent, 0)
for (resolveInfo in installedApps) {
if (resolveInfo.activityInfo.packageName.contains(packageName)) {
isInstalled = true
break
}
}
return isInstalled
}

private fun openExternalApp(activity: Activity, packageName: String) {
if (isInstalledExternalApp(activity, packageName)) {
val intent = activity.packageManager.getLaunchIntentForPackage(packageName)
intent?.flags = Intent.FLAG_ACTIVITY_NEW_TASK
activity.startActivity(intent)
} else {
// Not Installed
}
}

 

사용 예시

openExternalApp(this, "com.google.android.youtube")

또는

openExternalApp(this, "com.google.android.gm")

 

 

 

 

4. QUERY_ALL_PACKAGES 권한

여담으로 query 를 통해 특정 앱을 타겟으로 선언하였는데

QUERY_ALL_PACKAGES 는 설치된 모든 앱을 대상으로 공개 상태를 확대할 수 있는 권한입니다.

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

 

다만 위험성이 높거나 민감한 권한으로 분류되어 해당 권한을 사용하여 서비스하려면

정책 요구 사항을 충족해야 하고 Play Console 에 권한 선언 양식을 제출해야 한다고 하네요.

Android Developer : 폭넓은 패키지 가시성 권한 사용

 

음.. 특별한 이유가 아니라면 query 선언해서 사용하면 좋을 것 같습니다 ㅎㅎ

 

 

 

 

[Reference]

안드로이드 다른 앱 실행하기

 

 

 

0 comments: