在 Android 11 上调用 getPackageInfo 时出现 NameNotFoundException

Roy*_*erg 14 android android-permissions android-11

设置完成后targetSdkVersion,以30(安卓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)
Run Code Online (Sandbox Code Playgroud)

Roy*_*erg 36

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>
Run Code Online (Sandbox Code Playgroud)

查询所有应用程序并与之交互

我有一个应用程序需要能够询问所有应用程序的信息。您所要做的就是将以下内容添加到AndroidManifest.xml

<manifest ...>
     ...
     <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
     ...
     <application ...>
     ...
</manifest>
Run Code Online (Sandbox Code Playgroud)


小智 9

AndroidManifest.xml中需要为Android 11添加此内容,它对我有用

<permission android:name="android.permission.QUERY_ALL_PACKAGES" />


    <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />
        </intent>
    </queries>
Run Code Online (Sandbox Code Playgroud)