Не удалось найти поставщика контента в API 30

#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>