将targetSDKVersion
设置为30
(Android 11)后,当对我知道存在的包执行PackageManager.GetPackageInfo(packageName,PackageManager.Get_Permissions)
时,我将获得Android.content.pm.PackageManager$NameNotFoundException
。
堆栈跟踪如下:
android.content.pm.PackageManager$NameNotFoundException: com.google.android.apps.maps
at android.app.ApplicationPackageManager.getPackageInfoAsUser(ApplicationPackageManager.java:202)
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:174)
如https://developer.android.com/preview/privacy/package-visibility所述:
Android11改变了应用程序查询和与用户安装在设备上的其他应用程序交互的方式。 使用新元素,应用程序可以定义它们可以访问的其他应用程序集。 这一元素通过告诉系统哪些应用程序可以被你的应用程序看到,有助于鼓励最小特权原则,它还有助于Google Play等应用商店评估你的应用程序为用户提供的隐私和安全性。
如果您的应用程序针对Android11,您可能需要在应用程序的清单文件中添加该元素。 在元素中,您可以通过包名称或意图签名指定应用程序。
因此,您必须停止正在做的事情,或者请求访问有关某些包的信息,或者--如果有原因的话--使用权限query_all_packages
。
要查询特定包并与之交互,您需要如下更新AndroidManifest.xml
:
<manifest ...>
...
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
<application ...>
...
</manifest>
我有一个应用程序,需要能够要求所有应用程序的信息。 您只需将以下内容添加到AndroidManifest.xml
:
<manifest ...>
...
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
...
<application ...>
...
</manifest>