首页 > 解决方案 > 在 Android 11 上调用 getPackageInfo 时出现 NameNotFoundException

问题描述

设置targetSdkVersion30(Android 11)后,我在处理我知道存在的包android.content.pm.PackageManager$NameNotFoundException时得到了。packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS)

堆栈跟踪如下:

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)

标签: androidandroid-permissionsandroid-11

解决方案


https://developer.android.com/preview/privacy/package-visibility中所述:

Android 11 改变了应用查询用户在设备上安装的其他应用并与之交互的方式。使用新元素,应用程序可以定义他们可以访问的其他应用程序集。此元素通过告诉系统哪些其他应用对您的应用可见,有助于鼓励最小权限原则,并帮助 Google Play 等应用商店评估您的应用为用户提供的隐私和安全性。

如果您的应用面向 Android 11,您可能需要在应用的清单文件中添加该元素。在元素中,您可以按包名称或意图签名指定应用程序。

所以你要么必须停止你正在做的事情,要么请求访问某些包的信息,或者 - 如果你有理由 - 使用权限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>

推荐阅读