在安卓11上调用getPackageInfo时出现NameNotFoundException错误

41
在将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)
2个回答

88
根据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>

如果您在Play商店发布应用程序,请确保您的应用程序符合QUERY_ALL_PACKAGES的要求:https://developer.android.com/preview/privacy/package-visibility#all-apps - M66B
1
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> 这个标签有帮助。谢谢。有趣的 <queries>bla bla</queries> 代码没有起作用,合并清单错误。 - Nijat Aliyev
我发现在 Android 版本低于 11 的用户中出现了很多“NameNotFoundException”异常,例如 OnePlus 上的 Android 7.1.1。 我自己无法重现这个问题,所以我想知道是否可能是由于品牌特定的包可见性保护引起的。 - mieszko4
我的一小部分用户在应用程序请求有关其自身包的信息时遇到了这个错误。 - Lingviston

9
AndroidManifest.xml中,需要添加以下内容,这对于Android 11是必需的,并且这对我而言可以正常工作。
<permission android:name="android.permission.QUERY_ALL_PACKAGES" />


    <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />
        </intent>
    </queries>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接