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}
将有助于基于味道的项目结构,其中应用程序包可能对于每种口味而言是不同的.
有关更多解决方案或信息,请从此处获取.
对于热修复,请设置您的
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)
归档时间: |
|
查看次数: |
14812 次 |
最近记录: |