web-dev-qa-db-fra.com

Impossible de trouver les informations du fournisseur pour «ContentProvider»

J'ai un problème que je n'arrive pas à comprendre. J'utilise Eclipse pour créer mon propre fournisseur de contenu, mais je reçois toujours l'erreur suivante:

[..] ERREUR/ActivityThread (1051): impossible de trouver les informations du fournisseur pour my.package.provider.countrycontentprovider

Code trouvé ici: http://codepad.org/Rx00HjHd

Parties principales:

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" />

J'ai ajouté le fournisseur au manifeste et renvoie true à partir de la fonction onCreate. Je utilise le CountryContentProvider.CONTENT_URI dans mon activité pour obtenir le contenu de mon fournisseur, mais je continue de recevoir ce message d'erreur. J'ai supprimé et ajouté le code trois fois (en cas de fonte d'Eclipse) en vain.
J'ai dû louper quelque chose. Quelqu'un peut me diriger dans la bonne direction?

30
Default

J'ai pu reproduire votre problème lorsque j'ai déplacé <provider> de la balise <application> ... </application>. Eclipse n'a rien dit comme erreur ou avertissement.

Heureusement, ce problème est détecté par Android Lint à partir d'ADT 20.

49
Darth Beleg

Cela n'a fonctionné pour moi qu'après avoir spécifié le chemin complet dans la balise Authorities du fichier manifeste (voir l'exemple de code SearchableDictionary dans le SDK).

<provider Android:name=".DictionaryProvider"
       Android:authorities="com.example.Android.searchabledict.DictionaryProvider">
15
andude

La définition de l'attribut exporté sur true dans la balise de fournisseur du manifeste a fonctionné pour moi:

Android:exported="true"

Selon la documentation ( http://developer.Android.com/guide/topics/manifest/provider-element.html#exported ), l'exportation n'est requise que si le fournisseur doit être disponible pour d'autres applications. Mais c'est la seule solution qui a fonctionné pour moi.

1
faizal

L'Android: autorités = dans le fichier XML est l'autorité de contenu qui se trouve dans la classe de contrat que vous avez probablement créée. L'autorité de contenu est ajoutée au schéma pour créer l'URI de contenu de base. En anglais simple, le domaine inverse que vous avez utilisé pour rendre votre application sans majuscules ici com.domain.sub.appName.

Le nom Android: est le dossier et la classe de votre fournisseur, n'oubliez pas le point .folder.ProviderClassContentAuthorityIsIn.

J'espère que cela t'aides :)

0
TryHarder