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>