端末にインストールされているアプリ情報を取得する
ApplicationInfoの取得の仕方とちょっとした使い方
Created at

1350 Words
⚠️

型とか分かりやすくするために大体は関数で書いているが、あくまで紹介のためなので使うときは適当に変えるようにする。

インストール済みの全アプリ情報

val apps = context.packageManager.getInstalledApplications(0)

PackageManager#getInstalledApplications | Android デベロッパー | Android Developers

パッケージ名を指定してアプリ情報を取得

第二引数のフラグにPackageManager.MATCH_UNINSTALLED_PACKAGESが指定されている場合、指定されたパッケージがインストールされていなかったら「過去にインストールされていたが削除済みで、かつデータが残っている」アプリも探す。
それでも見つからなかったらPackageManager.NameNotFoundExceptionが送出される。

fun applicationInfo(packageName: String) : ApplicationInfo? =
    try {
        context.packageManager.getApplicationInfo(packageName, 0)
    }
    catch (e: PackageManager.NameNotFoundException) {
        null
    }

PackageManager#getApplicationInfo | Android デベロッパー | Android Developers

アプリの表示名を取得

たとえば Satena の場合、パッケージ名はcom.suihan74.satenaでランチャーなどに表示される表示名はSatenaである。

ApplicationInfo自体には表示名は格納されていない。
以下のようにして手動で取得する。

fun displayName(appInfo: ApplicationInfo) : CharSequense =
    context.packageManager.getApplicationLabel(appInfo)

または

fun displayName(appInfo: ApplicationInfo) : CharSequense =
    appInfo.loadLabel(context.packageManager)

表示名の取得に失敗した場合は、name(多分AndroidManifest.xmlに記述された<application>タグの属性android:nameの内容)が返される。

PackageManager#getApplicationLabel | Android デベロッパー | Android Developers

PackageItemInfo#loadLabel | Android デベロッパー | Android Developers

PackageItemInfo#name | Android デベロッパー | Android Developers

アプリアイコンをロードする

fun loadAppIcon(appInfo: ApplicationInfo) : Drawable =
    context.packageManager.getApplicationIcon(appInfo)

または

fun loadAppIcon(appInfo: ApplicationInfo) : Drawable =
    appInfo.loadIcon(context.packageManager)

アプリアイコンのロードに失敗した場合はデフォルトアイコンが返される。

PackageManager#getApplicationIconを使う場合、引数はApplicationInfoだけではなくパッケージ名の文字列でも可能。ただし先述した表示名の取得にはApplicationInfoが必要なので、大抵の場合どちらにしろApplicationInfoは必要になると思われる。

PackageManager#getApplicationIcon | Android デベロッパー | Android Developers

PackageItemInfo#loadIcon | Android デベロッパー | Android Developers

ロゴ、バナーなどもあるようだが同様なので割愛。

アプリ情報の種類を調べる

ApplicationInfoが指すアプリがシステムアプリかどうか」などのフラグを読んで、それがどんな種類のアプリの情報なのかを調べることができる。

  • FLAG_DEBUGGABLE … デバッグできる
  • FLAG_SYSTEM … システムにプリインストールされたアプリ
  • FLAG_UPDATED_SYSTEM_APP … アップデートされたプリインストールアプリ
  • FLAG_INSTALLED … 現在のユーザーが利用できる

など。他にも大きい(or小さい)画面で使用できるか、など色々フラグがあるっぽい。

参考

ApplicationInfo | Android デベロッパー | Android Developers

アプリを起動するためのインテントを取得する

外からアクティビティを直接起動できないアプリの場合nullが返る。

fun getLaunchIntent(appInfo: ApplicationInfo) : Intent? =
    context.packageManager.getLaunchIntentForPackage(appInfo.packageName)

アプリ情報取得時の追加オプション

とくに指定しない0の他、PackageManager.GET_~~を指定すれば該当する追加情報を付加して取得でき、PackageManager.MATCH_~~を指定すれば特殊な条件に合致するものを取得できる。

PackageManager#getInstalledApplicationsに渡せるフラグ

PackageManager#getInstalledApplications | Android デベロッパー | Android Developers

PackageManager#getApplicationInfoに渡せるフラグ

PackageManager#getApplicationInfo | Android デベロッパー | Android Developers

See Also