これまでgetPackageManager()#getInstalledPackages()を用いれば簡単に端末内のインストールアプリ情報を取得することができました。
しかし、Android 11(APIレベル30)からは単に下記のようなコードを記載するだけではシステムアプリ情報しか取得できなくなりました。
例)デバイス内のインストールアプリをLog出力する
MainActivity.java
PackageManager pm = getApplicationContext().getPackageManager();
List<PackageInfo> appInfoList = pm.getInstalledPackages(0);
for(int i =0;i<appInfoList.size();i++){
Log.d("MainActivity",appInfoList.get(i).applicationInfo.loadLabel(pm).toString());
}
何がダメだったか
Android 11(APIレベル30)からはセキュリティ的に厳しくなっており、外部パッケージへのアクセスについてはManifestに明示する必要があります。
解決策
AndroidManifest.xmlにパーミッションの記述を書いてしまう。
AndroidManifest.xml
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
…全部許可してしまうので非推奨なやり方だと思われます。
本来は<queries>
で囲って個別に明示するのが正しい方法なのかも。