Не удалось найти информацию о поставщике для ContentProvider.

У меня есть проблема, которую я просто не могу понять. Я использую Eclipse для создания собственного поставщика контента, но продолжаю получать следующую ошибку:

[..] ОШИБКА/ActivityThread(1051): не удалось найти информацию о провайдере для my.package.provider.countrycontentprovider

Код найден здесь: http://codepad.org/Rx00HjHd.

Основные части:

public class CountryContentProvider extends ContentProvider {

    public static final String PROVIDER = 
         "my.package.provider.countrycontentprovider";
    public static final Uri CONTENT_URI = 
         Uri.parse("content://" + PROVIDER + "/country");
    // ...
    @Override
    public boolean onCreate() { return true; }
    // ...
}


// from my activity
ContentResolver resolver = getContentResolver();
Cursor c = resolver.query(CountryContentProvider.CONTENT_URI, 
                                  null, null, null, null);  

// AndroidManifest.xml
<provider
    android:name="my.package.provider.CountryContentProvider"
    android:authorities="my.package.provider.countrycontentprovider" />

Я добавил провайдера в манифест и вернул true из функции onCreate. Я использую CountryContentProvider.CONTENT_URI в своей деятельности, чтобы получить контент от моего провайдера, но я просто продолжаю получать это сообщение об ошибке. Я удалял и добавлял код три раза (в случае таяния затмения) безрезультатно.
Должно быть, я что-то упустил. Может ли кто-нибудь указать мне в правильном направлении?


person Default    schedule 18.09.2011    source источник


Ответы (6)


Мне удалось воспроизвести вашу проблему, когда я переместил ‹provider> из тега ‹application>...‹/application>. Eclipse ничего не сказал об ошибке или предупреждении.

К счастью, эта проблема обнаруживается Android Lint, начиная с ADT 20.

person Darth Beleg    schedule 18.09.2011
comment
Итак, я имею в виду, что тег <provider> должен быть помещен внутри тега <application>. - person Shajeel Afzal; 26.04.2013
comment
Кроме того, будьте осторожны, чтобы не поместить его в тег ‹activity›, как я сделал вначале. - person Elad Avron; 27.09.2013

У меня это сработало только после указания полного пути в теге Authorities в файле манифеста (см. пример кода SearchableDictionary в SDK).

<provider android:name=".DictionaryProvider"
       android:authorities="com.example.android.searchabledict.DictionaryProvider">
person andude    schedule 06.12.2012

Установка атрибута exported в true в теге провайдера в манифесте у меня сработала:

android:exported="true"

Согласно документации (http://developer.android.com/guide/topics/manifest/provider-element.html#exported), экспорт требуется только в том случае, если поставщик должен быть доступен для других приложений. Но это единственное решение, которое сработало для меня.

person faizal    schedule 01.06.2014

android:authorities= в XML-файле — это авторитет контента, который находится в классе контракта, который вы, вероятно, создали. Полномочия по контенту добавляются в схему для создания базового URI контента. Проще говоря, обратный домен, который вы использовали, чтобы сделать ваше приложение без заглавных букв, здесь com.domain.sub.appName.

android:name — это папка плюс класс, в котором назван ваш провайдер, не забудьте точку .folder.ProviderClassContentAuthorityIsIn.

Надеюсь это поможет :)

person TryHarder    schedule 22.01.2017

у вас есть заглавная буква, а на другой строке одна строчная буква.

android:name= "my.package.provider.-C-countryContentProvider" android:authorities="my.package.provider.-c-countrycontentprovider"

везде должно быть одинаково.

public static final String PROVIDER = 
     "my.package.provider.countrycontentprovider";
person Drakonx    schedule 18.08.2014
comment
Полномочия должны совпадать (т.е. в манифесте такие же, как и в файле класса — my.package.provider.countrycontentprovider). И имена классов должны совпадать — my.package.provider.CountryContentProvider. Так что я не думаю, что это проблема. - person ban-geoengineering; 03.11.2014

Зарегистрируйте своего провайдера в манифесте Android

<provider
    android:authorities="your_content_authority"
    android:name="yourProviderClass"/>
person mposadar    schedule 22.09.2016