사용 단말에서 설치된 App 목록이나 특정 App 이 설치되어있는지 확인하고 싶은 경우가 있습니다.
Android 11(Target SDK 30) 이상에서 주의 해야될 부분을 간단하게 체크하였습니다.
1. packageInfo 목록 가져오기
private fun getInstalledPackages(context: Context): List<PackageInfo> {
return context.packageManager.getInstalledPackages(0)
}
# Check Point
SDK 30 이상에서는 일부 PackageInfo 가 포함이 안될 수 있습니다.
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
2. package 설치 여부 체크하기
private fun isInstalledAppPackage(context: Context, packageName: String): Boolean {
val intent = context.packageManager.getLaunchIntentForPackage(packageName)
return intent != null
}
# Check Point
SDK 30 이상에서는 AndroidManifest.xml 에 <queries> 가 추가해줘야 정상 동작합니다.
<queries>
<package android:name="패키지명" />
</queries>
3. 예제
특정 패키지만 queries 하고 테스트한 결과입니다.
AndroidManifest.xml
<queries>
<package android:name="com.kakao.talk" />
<package android:name="com.nhn.android.search" />
</queries>
MainActivity.kt
private val tag = "installedAppPackage"
private var appPackageName = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val installedPackageInfoList = getInstalledPackages(this)
Log.d(tag, "installedPackageInfoList size : ${installedPackageInfoList.size}")
appPackageName = "com.kakao.talk" // 카카오톡
Log.d(tag, "$appPackageName ${isInstalledAppPackage(this, appPackageName)}")
appPackageName = "com.nhn.android.search" // 네이버
Log.d(tag, "$appPackageName ${isInstalledAppPackage(this, appPackageName)}")
appPackageName = "com.samsung.android.app.notes" // 삼성 노트
Log.d(tag, "$appPackageName ${isInstalledAppPackage(this, appPackageName)}")
appPackageName = "com.android.chrome" // 크롬
Log.d(tag, "$appPackageName ${isInstalledAppPackage(this, appPackageName)}")
}
private fun getInstalledPackages(context: Context): List<PackageInfo> {
return context.packageManager.getInstalledPackages(0)
}
private fun isInstalledAppPackage(context: Context, packageName: String): Boolean {
val intent = context.packageManager.getLaunchIntentForPackage(packageName)
return intent != null
}
Logcat 결과는 아래와 같습니다.
D/installedAppPackage: installedPackageInfoList size : 322
D/installedAppPackage: com.kakao.talk true
D/installedAppPackage: com.nhn.android.search true
D/installedAppPackage: com.samsung.android.app.notes false
D/installedAppPackage: com.android.chrome false
[참고자료]
https://stackoverflow.com/questions/67189934/how-to-get-a-list-of-installed-apps-in-android-11
https://developer.android.com/about/versions/11/privacy/package-visibility
0 comments: