【问题标题】:NameNotFoundException when calling getPackageInfo on Android 11在 Android 11 上调用 getPackageInfo 时出现 NameNotFoundException
【发布时间】:2020-10-02 08:40:13
【问题描述】:

在将targetSdkVersion 设置为30(Android 11)后,在我知道存在的包上执行packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS) 时,我得到android.content.pm.PackageManager$NameNotFoundException

stacktrace如下:

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)

【问题讨论】:

    标签: android android-permissions android-11


    【解决方案1】:

    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>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2014-05-07
    • 2017-10-30
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多