Не удалось найти информацию о провайдере для ContentProvider.
У меня проблема, которую я просто не могу понять. Я использую Eclipse для создания своего собственного Content Provider, но продолжаю получать следующую ошибку:
[..] ERROR/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
в своей деятельности, чтобы получить контент от моего провайдера, но я просто продолжаю получать это сообщение об ошибке. Я удалил и добавил код три раза (в случае таяния затмения) безрезультатно.
Я должен что-то упустить. Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
Я смог воспроизвести вашу проблему, когда я переместил <provider> из тега <application> ... </application> . Eclipse не сказал ничего подобного ошибке или предупреждению.
К счастью, эта проблема обнаруживается Android Lint, начиная с ADT 20.
Ответ 2
Он работал у меня только после указания полного пути в теге Authorities
в файле манифеста (см. пример кода SearchableDictionary в SDK).
<provider android:name=".DictionaryProvider"
android:authorities="com.example.android.searchabledict.DictionaryProvider">
Ответ 3
Настройка экспортированного атрибута в true в теге провайдера в манифесте работала для меня:
android:exported="true"
Согласно документации (http://developer.android.com/guide/topics/manifest/provider-element.html#exported), экспорт требуется только в том случае, если поставщик должен быть доступен для других приложений. Но это единственное решение, которое сработало для меня.
Ответ 4
Андроид: authority = в файле XML - это орган контента, который находится в классе контракта, который вы, вероятно, создали. Владелец контента добавлен в схему для создания базового URI содержимого. Обычный английский, обратный домен, который вы использовали для создания своего приложения, не содержит здесь com.domain.sub.appName.
Андроид: имя - это папка плюс класс, на который указан ваш провайдер, не забудьте точку .folder.ProviderClassContentAuthorityIsIn.
Надеюсь, что это поможет:)
Ответ 5
у вас есть прописная буква, а на другой строке - одна строчная буква.
android: name= "my.package.provider.-C-ountryContentProvider"
Android: власти = "my.package.provider.-с-ountrycontentprovider"
он должен быть одинаковым везде.
public static final String PROVIDER =
"my.package.provider.countrycontentprovider";
Ответ 6
Зарегистрируйте своего провайдера в манифесте Android
<provider
android:authorities="your_content_authority"
android:name="yourProviderClass"/>