NameNotFoundException при вызове getPackageInfo на Android 11

После установки targetSdkVersion к 30 (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)

2 ответа

Решение

Как указано в 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>

В AndroidManifest.xml необходимо добавить это как для Android 11 , так и для меня.

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


    <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />
        </intent>
    </queries>
Другие вопросы по тегам