앱에서 기존에 설치되어있는 "연락처", "내 파일", "유튜브" 등등의 다른 앱들을
실행시켜서 보여줘야 하는 경우가 꽤 있습니다.
이번 글에서는 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: