SecurityException: Failed to find provider null for user 0; on ActiveAndroid on Android 8.0

22,723

Solution 1

As pointed out by @GeigerGeek security changes on Android 26 and above require you to specify the content provider in your manifest.

For ActiveAndroid you can add the below to your Manifest and change your package name.

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

If using flavours on your build process you can use below instead:

android:authorities="${applicationId}"

Using ${applicationId} will help in flavor based project structure where application package may be different for each flavors.

For more solutions or info this was taken from here.

Solution 2

For hot fix, set your

compileSdkVersion 25
targetSDKVersion 25

and you will ignore android O features. It will save your day!

important for hot fix:

But this solution will be invalid.

August 2018: New apps required to target API level 26 (Android 8.0) or higher. November 2018: Updates to existing apps required to target API level 26 or higher. 2019 onwards: Each year the targetSdkVersion requirement will advance. Within one year following each Android dessert release, new apps and app updates will need to target the corresponding API level or higher.

Another ways, you can fix with ActiveAndroid but It is deprecated now. You can try or you can try ReActiveAndroid

with ActiveAndroid, visit https://github.com/pardom/ActiveAndroid/issues/536#issuecomment-344470558

When project have defined model classes in java source code through addModelClasses configuration method application will still be crashing cause model classes wont be loaded through that configuration. In that situation You need to move model definition to the AndroidManifest.xml file.

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();
 }}

If you are doing something with FileProvider, don't miss to change package name

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

Solution 3

Android O apparently requires the use of a custom ContentProvider for database usage, even if you do not intend to share your data with other applications.

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

Your custom class must be defined in a provider tag within your application tag in AndroidManifest.xml. If applicable, set exported=false to protect your data from external usage.

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

For me the problem arose because I was calling notifyChange from the contentResolver. I ended up not needing this, so I was able to avoid implementation a ContentProvider.

Solution 4

if your package is different from your applicationId then you should use the applicationId

<provider
            android:name="com.activeandroid.content.ContentProvider"
            android:authorities="${applicationId}"
            android:exported="false" />
Share:
22,723
rindress
Author by

rindress

Updated on May 06, 2020

Comments

  • rindress
    rindress about 4 years

    I have an app that is using ActiveAndroid and it's been working fine. However; now when I try to save a model to the database I'm getting a SecurityException.

    The stack is:

    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]
    

    Has anyone else experienced this? Do we need to specify the Content Provider in the AndroidManifest.xml?

    Sorry but I do not have an isolated example of this yet. I will work to put something together.

    Thanks in advance

  • Katerina A.
    Katerina A. over 6 years
    This doesn't fix the problem.
  • nasch
    nasch about 6 years
    I don't think ReActiveAndroid is from the same team. "Unfortunately, the author of [ActiveAndroid] stopped maintaining it, so I decided to continue maintain the library instead of him."
  • Kirill Karmazin
    Kirill Karmazin over 5 years
    note: authorities may be other strings, not just your package name