2022年7月19日
開発環境
OS:Windows 10
SDK:Android Studio Chipmunk | 2021.2.1
概要
Android 12におけるセキュリティ強化。
それに伴い、権限なしにインストール済アプリをピックアップすることができなくなってました、という話です。
スマホの機種変更
androidアプリ開発をしている以上もちろんAndroid 12での動作検証も行います。
とは言っても検証はもっぱら仮想デバイスでした。
それが最近、スマホを買い替え、ようやくAndroid 12の実機が我が手元に。
生でAndroid 12に触れる機会ができたので早速、アプリを色々と動かしてみたのですが。。。
早々と想定通りに動作していない機能を発見、慌てて改修した次第です。
仮想デバイスでは検証しにくい機能なんです。。。
Android12のセキュリティ強化
想定通りに動作しなかった機能とは何か?
それは、インストール済アプリのピックアップ機能です。
コードで表すと Packagemanager の getInstalledPackages です。
Android 12のセキュリティ強化に伴い、権限、もしくは、<queries>定義なしに
インストール済アプリをピックアップできなくなった、とのこと。
この機能がダメになるとランチャー系のアプリは全滅です。
そこで2パターンの方法で改修を行いました。
パターン1)どうしてもインストール済アプリを全て知りたい
ランチャー系アプリの場合、インストール済アプリを全てピックアップしたいので権限追加で対応します。
AndroidManifest.xmlに以下のパーミションを追加します。
<uses-permission android:name=”android.permission.QUERY_ALL_PACKAGES”/>
対応は以上です。
あとはビルドしてリリースするだけなのですが、なにせ強力な権限です。
Google Play Consoleの「アプリのコンテンツ」において権限の用途を説明する必要があります。

まずは目的の説明を記載し、そして、用途の選択を行います。

ランチャーアプリの場合、
目的は「ランチャーアプリ。アプリリストを表示するため」、
用途は「アプリの機能」、と明確です。
そして、最後に求められるのが動画です。

ざっくりと作ってYouTubeにアップしてみました。
まさか動画を求められるとは。。。
すると、まあ、なんということでしょう。
リリースしてから1時間もしないうちに審査が通り、インストールできるようになりました。
パターン2)必要なアプリだけインストールされていることを知りたい
アプリの連携のため、連携対象のアプリがインストールされているか知りたい。
そのような場合、
AndroidManifest.xmlに以下の定義を追加します。
(アプリ”com.sample.application”がインストールされているか知りたい場合)
<manifest ・・・>
<queries>
<package android:name="com.sample.application" />
</queries>
<application ・・・
</application>
</manifest>
これで Packagemanager の getInstalledPackagesまわりは改修しなくても対象アプリをピックアップしてくれるようになります。
あとはビルドしてリリースするだけです。
こちらのパターンの場合、Google Play Consoleで「アプリのコンテンツ」を記載する必要もありません。
Android 12のセキュリティ強化に伴う対応は以上です。