6

我有一個應用程序使用ActiveAndroid,它一直工作正常。然而;現在當我嘗試將模型保存到數據庫時,我得到一個SecurityException。SecurityException:無法找到用戶0的提供者null; on Android 8.0上的ActiveAndroid

堆棧是:

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] 

有其他人遇到此?我們是否需要在AndroidManifest.xml中指定內容提供商

對不起,但我還沒有一個孤立的例子呢。我會努力把東西放在一起。

在此先感謝

+2

「無法找到提供者null「表明一個格式錯誤的Uri',一個其權限字符串缺失或字面意義爲」空「的人。 – CommonsWare

+0

我得到了同樣的崩潰,但在堆棧跟蹤中使用了「null」作爲提供者的其他內容。不知道爲什麼會發生這種情況,但它只發生在Android 8上... – Otziii

+1

這個讓我瘋狂。定位SDK 25工作正常,針對26+崩潰與這個錯誤。我已經正確設置了提供者的權限。還是這次崩潰。我不知道這是關於什麼的。當然,我的Uri在電話會議上並不是空話!你現在有什麼新東西? – Zordid

回答

-1

我曾與在Android O. Android活躍完全相同的問題原來,在我的自定義的方法之一ContentProvider的返回Uri,有時它會返回null,這是造成問題。所以我將@Nullable註釋添加到如下所示的解決該問題的方法中。

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

這不能解決問題。 –

0

的AndroidØ顯然需要使用定製的ContentProvider的用於數據庫使用,即使您不打算與其他應用程序共享您的數據。

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

您的自定義類必須在供應商標籤在AndroidManifest.xml應用程序標籤中定義。如果適用,設置exported = false以保護您的數據免受外部使用。

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

對我來說,問題出現了,因爲我從contentResolver調用notifyChange。我最終不需要這個,所以我能夠避免實現一個ContentProvider。

2

正如@GeigerGeek指出的,Android 26及以上版本的安全更改要求您在清單中指定內容提供者。

對於ActiveAndroid,您可以將以下內容添加到您的清單並更改您的包名稱。

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

更多的解決方案或信息這是採取from here.

0

編輯清單,並添加端應用節點此提供標籤節點。

<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> 

我用這個,它解決了我的錯誤。 Click here for demo

0

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

當項目已在Java源代碼通過addModelClasses配置方法應用程序中定義的模型類仍然會崩潰不會通過該配置被加載原因模型類。在這種情況下,您需要將模型定義移動到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(); 
}} 

如果你正在做一些FileProvider,千萬不要錯過改變包名

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