web-dev-qa-db-fra.com

SecurityException: Impossible de trouver le fournisseur NULL pour l'utilisateur 0; sur ActiveAndroid sur Android 8.0

J'ai une application qui utilise ActiveAndroid et ça fonctionne bien. Toutefois; maintenant, lorsque j'essaie d'enregistrer un modèle dans la base de données, une exception SecurityException s'affiche. 

La pile est:

Error saving model Java.lang.SecurityException: Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority 
at Android.os.Parcel.readException(Parcel.Java:1942) 
at Android.os.Parcel.readException(Parcel.Java:1888) 
at Android.content.IContentService$Stub$Proxy.notifyChange(IContentService.Java:801) 
at Android.content.ContentResolver.notifyChange(ContentResolver.Java:2046) 
at Android.content.ContentResolver.notifyChange(ContentResolver.Java:1997) 
at Android.content.ContentResolver.notifyChange(ContentResolver.Java:1967) 
at com.activeandroid.Model.save(Model.Java:162)
[.... local stack removed]

Quelqu'un d'autre a-t-il vécu cela? Devons-nous spécifier le fournisseur de contenu dans le fichier AndroidManifest.xml

Désolé mais je n'ai pas encore d'exemple isolé de cela. Je vais travailler pour mettre quelque chose ensemble.

Merci d'avance

21
rindress

Comme l'a souligné @GeigerGeek, les modifications de la sécurité sur Android 26 et versions ultérieures nécessitent que vous spécifiiez le fournisseur de contenu dans votre manifeste. 

Pour ActiveAndroid, vous pouvez ajouter le texte ci-dessous à votre manifeste et modifier le nom de votre package.

<provider
  Android:name="com.activeandroid.content.ContentProvider"
  Android:authorities="<your.package.name>"
  Android:enabled="true"
  Android:exported="false">
</provider>

Si vous utilisez des variantes sur votre processus de construction, vous pouvez utiliser ci-dessous:

Android:authorities="${applicationId}"

L'utilisation de ${applicationId} aidera dans la structure de projet basée sur la saveur où le package d'application peut être différent pour chaque saveur.

Pour plus de solutions ou d'informations, cela a été pris à partir d'ici.

39
velval

Pour le correctif, définissez votre

compileSdkVersion 25
targetSDKVersion 25

et vous ignorerez les fonctionnalités Android O. Cela vous sauvera la journée! 

important pour le correctif:

Mais cette solution sera invalide.

Août 2018: Nouvelles applications requises pour cibler l'API de niveau 26 (Android 8.0) ou supérieur . Novembre 2018: Mises à jour des applications existantes requises pour cibler l'API de niveau 26 ou supérieur. . Un an après la publication de chaque dessert sur Android, les nouvelles applications et mises à jour devront cibler le niveau d’API correspondant ou une version supérieure.

Autre moyen, vous pouvez corriger avec ActiveAndroid mais il est obsolète maintenant. Vous pouvez essayer ou vous pouvez essayer ReActiveAndroid

avec ActiveAndroid, visitez https://github.com/pardom/ActiveAndroid/issues/536#issuecomment-344470558

Lorsque le projet a défini des classes de modèle dans le code source Java via la méthode de configuration addModelClasses, l'application continue de planter car les classes de modèle ne sont pas chargées via cette configuration. Dans ce cas, vous devez déplacer la définition du modèle dans le fichier AndroidManifest.xml.

AndroidManifest.xml

<provider
    Android:name=".content.DatabaseContentProvider"
    Android:authorities="your package name"
    Android:exported="false" />

DatabaseContentProvider.Java

...
import com.activeandroid.content.ContentProvider;
...

public class DatabaseContentProvider extends ContentProvider {

@Override
protected Configuration getConfiguration() {
    Configuration.Builder builder = new Configuration.Builder(getContext());
    builder.addModelClass(SomeModel.class);
    builder.addModelClass(OtherModel.class);
    return builder.create();
 }}

Si vous faites quelque chose avec FileProvider, ne manquez pas de changer le nom du paquet

 Uri contentUri = FileProvider.getUriForFile(mContext,
            "your package name", new File(mImageFilePath));
5
Ahmet Cengiz

Android O nécessite apparemment l'utilisation d'un ContentProvider personnalisé pour l'utilisation de la base de données, même si vous n'avez pas l'intention de partager vos données avec d'autres applications.

https://developer.Android.com/about/versions/oreo/Android-8.0-changes.html

Votre classe personnalisée doit être définie dans une balise de fournisseur dans votre balise d'application dans AndroidManifest.xml. Le cas échéant, définissez exports = false pour protéger vos données de toute utilisation externe.

<provider Android:name=".MyContentProvider"
    Android:exported="false"
    Android:authorities="com.your_app_path.MyContentProvider"/>

Pour moi le problème est survenu parce que j'appelais notifyChange depuis le contentResolver. J'ai fini par ne plus avoir besoin de cela, j'ai donc pu éviter d'implémenter un ContentProvider.

3
GeigerGeek

Peut-être à cause de votre uri est nul lorsque vous utilisez notifyChange, https://developer.Android.com/about/versions/oreo/Android-8.0-changes.html#ccn

Android O ajoutera un chèque pour le fournisseur:

311 .checkContentProviderAccess(uri.getAuthority(), userHandle);
312 if (msg != null) {
313 if (targetSdkVersion >= Build.VERSION_CODES.O) {
314 throw new **SecurityException**(msg);
315 } else {
0
Willow

J'ai été redirigé vers cette question lorsque je cherchais le même problème. Cependant, cette question spécifique concerne une implémentation de bibliothèque spécifique. Pour remédier à cette erreur due aux modifications nouvellement introduites dans Android O, nous devons fournir l’autorité spécifique à ContentProvider en ajoutant ce qui suit dans le fichier AndroidManifest.xml sous la balise application.

<provider
    Android:name=".DatabaseContentProvider"
    Android:authorities="com.yourpackage.name"
    Android:exported="false" /> 

Et vous devez avoir une classe ContentProvider comme celle-ci. 

public class DatabaseContentProvider extends ContentProvider {

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        return null;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri,
                        @Nullable String[] projection,
                        @Nullable String selection,
                        @Nullable String[] selectionArgs,
                        @Nullable String sortOrder) {
        return null;
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values,
                      @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }
}
0
Reaz Murshed