사용 단말에서 설치된 App 목록이나 특정 App 이 설치되어있는지 확인하고 싶은 경우가 있습니다. Android 11(Target SDK 30) 이상에서 주의 해야될 부분을 간단하게 체크하였습니다.       1. packageInfo 목록 가져...

[안드로이드] 앱 설치여부 : Installed App (Package visibility in Android 11)

 


사용 단말에서 설치된 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 가 포함이 안될 수 있습니다.

모든 packageInfo 를 가져오기 위해서는 "android.permission.QUERY_ALL_PACKAGES" 권한이 필요합니다.

 <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: