#android #provider
#Android #android-contentprovider #android-contentresolver
Вопрос:
ОБНОВЛЕНИЕ: я должен полностью изменить свой вопрос, поскольку я нашел более подробную информацию, связанную с моей проблемой.
Проблема: мое приложение, которое разрешает поставщика контента, не работает в эмуляторе с API 30. Ошибка:
java.lang.SecurityException: Failed to find provider com.a52.datafeeder01.MyProvider for user 0; expected to find a valid ContentProvider for this authority
Если я использую API 26,27,28 и 29, то проблем нет.
AndroidManifest.xml в приложении с ContentProvider:
<manifest>
<permission
android:name="MyProvider._READ_PERMISSION"
android:protectionLevel="normal" />
<application>
<activity>
...
</activity>
<provider android:name=".MyProvider"
android:authorities="com.a52.datafeeder01.MyProvider"
android:enabled="true"
android:exported="true"
android:readPermission="MyProvider._READ_PERMISSION"/>
</application>
</manifest>
AndroidManifest.xml в клиентском приложении :
<manifest>
...
<uses-permission android:name="MyProvider._READ_PERMISSION" />
...
</manifest>
Если я попытаюсь разрешить поставщика контента в том же приложении, это сработает.
Если я использую packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)
в своем клиентском коде для получения списка существующих поставщиков, то для API [26,29] я вижу своего поставщика в списке. Если я выполню этот код в API 30, моего провайдера нет в списке.
Похоже, что в API 30 что-то изменилось, связанное с регистрацией ContentProvider. Однако я не могу найти, что.
Комментарии:
1. Пожалуйста, покажите полное определение поставщика из манифеста.
2. @blackapps, я обновил определение поставщика своими последними изменениями
3. Разве не отсутствует разрешение общего uri?
4. @blackapps, я пробовал с разрешения uri, но это не имеет никакого значения. По-прежнему отлично работает на устройстве и не работает на симуляторе.
5. Вы не показали инструкцию / код приложения-2, который вызывает это исключение.
Ответ №1:
Причина, по которой мой пользовательский ContentProvider не работает на эмуляторе с API 30, заключается в видимости пакета в Android 11
Чтобы исправить мою проблему, я добавил следующий <queries>
элемент в клиентский AndroidManifest.xml:
<manifest>
...
<queries>
<package android:name="com.a52.datafeeder01" />
</queries>
...
</manifest>
где указано com.a52.datafeeder01
имя пакета, в котором определен пользовательский ContentProvider.
Комментарии:
1. 1 потратил много времени, задаваясь вопросом, почему мой контент-провайдер работает на реальном устройстве, а не на эмуляторе. Только что выяснил, что эмулятор основан на API 30, и эта видимость пакета вызывала проблемы. Это правильное решение, но я должен заменить package тегом provider.
Ответ №2:
В случае моей проблемы просто добавьте:
<manifest>
...
<queries>
<provider android:authorities="com.example.appcontainprovider" />
</queries>
...
</manifest>
где authorities
значение — полномочия поставщика.
Ссылка: https://developer.android.com/training/basics/intents/package-visibility#provider-authority
Комментарии:
1. Это решение не сработало для меня, единственное решение, которое сработало для меня, — это указать имя пакета внутри тега пакета следующим образом <запросы> <package android:name=»com.a52.datafeeder01″ /> </queries> Может кто-нибудь, пожалуйста, скажите, в чем разница в обоих этих подходах?
Ответ №3:
Пожалуйста, добавьте следующее разрешение в манифест
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission"/>
Это решило мою проблему в Android 11
Комментарии:
1. Огромное спасибо .. это отлично работает Инструменты «QUERY_ALL_PACKAGES»: игнорировать =»QueryAllPackagesPermission»/>
2. Google Play ограничивает использование разрешений с высокой степенью риска или конфиденциальных разрешений, включая разрешение QUERY_ALL_PACKAGES, которое позволяет просматривать список установленных приложений на данном устройстве. Для получения более подробной информации вы можете прочитать эту статью: support.google.com/googleplay/android-developer/answer /…
Ответ №4:
С Android 11 произошли изменения в видимости пакета. Поэтому необходимо добавить запросы, как показано ниже
https://developer.android.com/training/package-visibility
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="yourPackage">
<queries>
<provider android:authorities="providerAuthority" />
</queries>
//Add your content provider's permission
<uses-permission android:name="com.example.permission" />
<application ...../>
</manifest>