3 votes

Permission refusée pour le fournisseur de contenu lorsqu'elle est appelée à partir de la même application

J'ai seulement une application. Il a un fournisseur de contenu qui n'est pas exporté (je ne veux pas que d'autres applications aient accès au contenu) J'utilisais avec succès le fournisseur de contenu jusqu'à présent.

J'ai créé un observateur de contenu pour mettre à jour un TextView. La méthode onChange est appelée lorsque le contenu change et essaie de reconsulter ce contenu. C'est à ce moment-là qu'il obtient l'exception de sécurité qui ressemble à ceci:

java.lang.SecurityException: Refus de permission : la lecture de l'URI du fournisseur de contenu org.sil.lcroffline.data.DataProvider content://org.sil.lcroffline/users/by_account_name/5555544444 depuis pid=0, uid=1000 nécessite que le fournisseur soit exporté, ou accorderUriPermission()

Voici le code qui la génère:

@Override
public void onChange(boolean selfChange, Uri uri) {
    Cursor c = null;
    try {
        c = mContentResolver.query(UserEntry.buildUserPhoneUri(mAccount.name), null, null, null, null);
        // faire des choses avec les données dans le curseur
    } finally {
        if (c != null) c.close();
    }
}

L'URI semble être formé correctement, et je ne pense pas qu'il y ait un problème pour le faire correspondre dans le fournisseur de contenu.

Le code ci-dessus fonctionne bien lorsqu'il est appelé de manière programmatique à partir de l'application, c'est seulement lorsqu'il est déclenché par un changement dans les données observées que l'Exception se produit.

Comment pourrais-je obtenir un refus de permission de l'intérieur de la même application, et comment puis-je résoudre cela?

Voici le manifeste:

3voto

Toby 1 Kenobi Points 2208

Il s'avère que cela est causé par le fait que je n'utilise pas un Handler dans le ContentObserver

Lorsque vous ne passez pas de gestionnaire à l'observateur de contenu, la méthode onChange est appelée directement au lieu qu'un message soit envoyé via le gestionnaire pour l'appeler. C'est bien beau, sauf que le processus qui appelle la méthode onChange dans cette situation est le système d'exploitation, qui n'a pas les autorisations nécessaires pour interroger mon fournisseur de contenu.

Pour corriger cela, j'ai modifié le code où mon observateur de contenu est créé de ceci :

mUserObserver = new ContentObserver(null) {
    // remplacer les méthodes onChange ici
}

À ceci :

mUserObserver = new ContentObserver(new Handler()) {
    // remplacer les méthodes onChange ici
}

J'ai trouvé des informations grâce à cette question

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X