6

J'ai une application qui utilise ActiveAndroid et il a bien fonctionné. Toutefois; Maintenant, quand j'essaie de sauvegarder un modèle dans la base de données, je reçois une SecurityException.SecurityException: Impossible de trouver le fournisseur null pour l'utilisateur 0; sur ActiveAndroid sur Android 8.0

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 at-il vécu cela? Devons-nous spécifier le Content Provider dans le AndroidManifest.xml?

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

Merci à l'avance

+2

« Impossible de trouver provider null "suggère un" Uri "mal formé, dont la chaîne d'autorité est manquante ou littéralement" "null" '. – CommonsWare

+0

Je reçois le même plantage, mais avec autre chose que "null" en tant que fournisseur dans la pile. Ne sachez pas pourquoi cela se produit, mais il ne se produit que sur Android 8 ... – Otziii

+1

Celui-ci me rend fou. Le ciblage du SDK 25 fonctionne correctement, en ciblant 26 crashs avec exactement cette erreur. J'ai fixé l'autorité dans le fournisseur correctement. Toujours cet accident. Je n'ai aucune idée de quoi il s'agit. Bien sûr, mon Uri n'est pas nul à l'appel! Avez-vous quelque chose de nouveau? – Zordid

Répondre

-1

J'ai eu exactement le même problème avec Android actif sur Android O. avère que l'une des méthodes dans mon habitude ContentProvider retourné un Uri, quelques fois il retournerait nul et cela a été l'origine du problème. J'ai donc ajouté l'annotation @Nullable à la méthode comme indiqué ci-dessous qui a résolu le problème.

@Nullable 
@Override 
public Uri insert(Uri uri, ContentValues contentValues) {..} 
+0

Cela ne résout pas le problème. –

0

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 au sein de votre étiquette d'application dans AndroidManifest.xml. Le cas échéant, définissez exporté = false pour protéger vos données contre l'utilisation externe.

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

Pour moi, le problème se pose parce que j'appelle NotifyChange du ContentResolver. J'ai fini par ne pas avoir besoin de ça, donc j'ai pu éviter l'implémentation d'un ContentProvider.

2

Comme l'ont souligné @GeigerGeek, les modifications de sécurité sur Android 26 et les versions supérieures exigent que vous spécifiez le fournisseur de contenu dans votre manifeste. Pour ActiveAndroid, vous pouvez ajouter le code ci-dessous à votre manifeste et modifier le nom de votre paquet.

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

Pour plus d'informations ou des solutions ceci a été pris from here.

0

Modifier Manifest et ajouter ce nœud de balise de fournisseur dans le nœud d'application côté.

<application ....> 
    <provider android:name="com.activeandroid.content.ContentProvider" 
     android:exported="false" 
     android:enabled="true" 
     android:authorities="here will be package name of your app"/> 
..... 
</application> 

Je l'utilise et cela a corrigé mon erreur. Click here for demo.

0

Visitez https://github.com/pardom/ActiveAndroid/issues/536#issuecomment-344470558

Lorsque projet ont défini des classes de modèle dans le code source java grâce à l'application de la méthode de configuration addModelClasses sera toujours écraser cause à des classes de modèle ne sera pas chargé dans cette configuration. Dans cette situation, 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 package

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