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
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.
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));
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.
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 {
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;
}
}