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を追加して下さい。
Related Posts
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法