SecurityException:无法为用户0找到提供程序null; 在Android 8.0上的ActiveAndroid上

rin*_*ess 30 android securityexception activeandroid android-8.0-oreo

我有一个使用ActiveAndroid的应用程序,它一直工作正常.然而; 现在当我尝试将模型保存到数据库时,我得到了一个SecurityException.

堆栈是:

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]
Run Code Online (Sandbox Code Playgroud)

还有其他人经历过这个吗?我们是否需要在AndroidManifest.xml中指定Content Provider

对不起,但我还没有一个孤立的例子.我会努力把东西放在一起.

提前致谢

vel*_*val 45

正如@GeigerGeek所指​​出的,Android 26及更高版本的安全更改要求您在清单中指定内容提供程序.

对于ActiveAndroid,您可以将以下内容添加到Manifest并更改您的包名称.

<provider
  android:name="com.activeandroid.content.ContentProvider"
  android:authorities="<your.package.name>"
  android:enabled="true"
  android:exported="false">
</provider>
Run Code Online (Sandbox Code Playgroud)

如果在构建过程中使用flavor,则可以使用以下代码:

android:authorities="${applicationId}"
Run Code Online (Sandbox Code Playgroud)

使用${applicationId}将有助于基于味道的项目结构,其中应用程序包可能对于每种口味而言是不同的.

有关更多解决方案或信息,请从此处获取.


Ahm*_*giz 5

对于热修复,请设置您的

compileSdkVersion 25
targetSDKVersion 25
Run Code Online (Sandbox Code Playgroud)

你会忽略android O功能.它会节省你的一天!

热修复很重要:

但是这个解决方案无效.

2018年8月:要求API级别26(Android 8.0)或更高级别的新应用程序.2018年11月:针对API级别26或更高级别所需的现有应用程序的更新.2019年起:每年targetSdkVersion要求将提前.在每个Android甜点发布后的一年内,新的应用和应用更新将需要针对相应的API级别或更高级别.

另一种方法,您可以使用ActiveAndroid修复但现在已弃用.您可以尝试或者您可以尝试ReActiveAndroid

使用ActiveAndroid,请访问https://github.com/pardom/ActiveAndroid/issues/536#issuecomment-344470558

当项目通过addModelClasses配置方法在java源代码中定义了模型类时,应用程序仍然会崩溃,因为模型类不会通过该配置加载.在这种情况下,您需要将模型定义移动到AndroidManifest.xml文件.

AndroidManifest.xml中

<provider
    android:name=".content.DatabaseContentProvider"
    android:authorities="your package name"
    android:exported="false" />
Run Code Online (Sandbox Code Playgroud)

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();
 }}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用FileProvider执行某些操作,请不要错过更改包名称

 Uri contentUri = FileProvider.getUriForFile(mContext,
            "your package name", new File(mImageFilePath));
Run Code Online (Sandbox Code Playgroud)


小智 -2

我在 Android O 上的活动 android 上遇到了完全相同的问题。事实证明,我的自定义 ContentProvider 中的方法之一返回了 a Uri,有时它会返回 null,这导致了问题。因此,我将@Nullable注释添加到方法中,如下所示,解决了问题。

@Nullable
@Override
public Uri insert(Uri uri, ContentValues contentValues) {..}
Run Code Online (Sandbox Code Playgroud)