Android - PackageManagerにPackage情報を取得する

PackageManagerはPackage、Application情報を得ることができるAPIを提供します。

  • PackageManager.getInstalledPackages(int flags)
  • PackageManager.getPackageInfo(String packageName, int flags)
  • PackageManager.getApplicationInfo(String packageName, int flags)

また、PackageManagerは、Activity、Service、Provider、Receiverの情報を得ることができるQuery apiを提供しています。

  • PackageManager.queryIntentActivities(Intent intent, int flags)
  • PackageManager.queryBroadcastReceivers(Intent intent, int flags)
  • PackageManager.queryIntentServices(Intent intent, int flags)
  • PackageManager.queryIntentContentProviders(Intent intent, int flags)

上記のAPIを使用してPackage情報とAppのComponent情報を得ることができます。

それぞれのAPIを使用する方法を紹介します。

Package情報

次のAPIを使用してPackage情報を得ることができ、PackageInfoオブジェクトに渡されます。

  • getPackageInfo(String packageName, int flags):引数として渡されたパッケージ名のパッケージ情報をPackageInfoにリ
  • getInstalledPackages(int flags):デバイスにインストールされたすべてのパッケージに関する情報をPackageInfoリストにリ

getPackageInfo()

getPackageInfo()は次のように引数として渡されたpackage nameのPackageInfoオブジェクトを返します。通常flagsは0を渡します。 PackageInfoはpackageName、versionName、ApplicationInfoなどの情報を持っています。

val pi : PackageInfo = packageManager.getPackageInfo("com.example.sample", 0)

val packageName = pi.packageName
val versionName = pi.versionName
val applicationInfo = pi.applicationInfo

PackageInfoが提供するデータは、Android Developer - PackageInfoを参照してください。

flags

getPackageInfo()に渡されるflagsは、次のようなものを渡すことができ、使用する理由は、次のとおりです。もし現在インストールされていて、使用可能なAppを対象に情報を取得しflagsは0を渡してください。

  • PackageManager.MATCH_UNINSTALLED_PACKAGES:uninstalled状態にあるパッケージの情報も取得します。たまにsystem appはuninstalled状態であるアプリがあります。または他のUserにインストールされているがAppが実行されているUserには、インストールされていない状態である場合もあります
  • PackageManager.MATCH_DISABLED_COMPONENTS:disabled状態にあるパッケージの情報も取得します

これから紹介するAPIのflags引数の目的と使用方法も同様同じです。

Package visibility

もし必要なデータが返されない場合は、自分のアプリが Package visibilityという機能に対して措置がされていることを確認する必要があります。

Android 11でPackage visibilityと呼ばれる機能が適用されました。 API 30をターゲティングするアプリは、他のパッケージの情報を見つけることができない制約事項です。必要であればAndroidManifestに特定のパッケージを移動したいとの要求をする必要があります。

もし次のようにManifestにパーミッションを追加すると、すべてのパッケージを閲覧することができます。

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

getInstalledPackages()

getInstalledPackages()は次のように使用することができ、デバイスにインストールされたすべてのパッケージのPackageInfoをリストで返します。

val pis : List<PackageInfo> = packageManager.getInstalledPackages(0)

getApplicationInfo()

getApplicationInfo()は引数として渡されたpackage nameのApplicationInfoオブジェクトを返します。 getPackageInfo()と比較するとPackageInfoではなく、ApplicationInfoを返す違いがあります。

val ai : ApplicationInfo = packageManager.getApplicationInfo("com.example.sample", 0)

ApplicationInfoが提供するデータは、Android Developer - ApplicationInfoを参照してください。

Component情報

下の4つのAPIは、Activity、BroadcastReceiver、ContentProvider、Serviceについて検索し、結果をResolveInfoリストで返します。 使用方法は、すべて同じであるため queryIntentActivities()にのみ紹介します。

  • PackageManager.queryIntentActivities(Intent intent, int flags)
  • PackageManager.queryBroadcastReceivers(Intent intent, int flags)
  • PackageManager.queryIntentServices(Intent intent, int flags)
  • PackageManager.queryIntentContentProviders(Intent intent, int flags)

queryIntentActivities()

queryIntentActivities()は引数としてIntentとflagsを受け取ります。このAPIは、引数として渡されたIntentを解釈して、これと関連したActivityをResolveInfoリストで返します。 ResolveInfoはActivity 1つの情報が含まれていると考えています。

次のコードではIntentはLaunchable Activityを代表するIntentです。このIntentを引数として渡すと、Launchable Activityの情報が戻されます。 ResolveInfoを通じてpackageName、Label、Iconなどの情報を得ることができます。

val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_LAUNCHER)
val ris : List<ResolveInfo> = packageManager.queryIntentActivities(intent, 0)

for (ri in ris) {
    val packageName = ri.activityInfo.packageName
    val className = ri.activityInfo.name
    val label = ri.loadLabel(packageManager).toString()
    val icon = ri.loadIcon(packageManager)
}

ResolveInfoが提供するデータは、Android Developer - ResolveInfoを参照してください。

まとめ

PackageManager APIを使用して、デバイスにインストールされてPackage情報とComponentの情報を取得する方法を説明しました。一般的に、引数flagsは0を使用すると、され、より多くの情報を得たいときに必要なflagsを追加して下さい。

codechachaCopyright ©2019 codechacha