6

Tôi có một ứng dụng đang sử dụng ActiveAndroid và nó hoạt động tốt. Tuy nhiên; bây giờ khi tôi cố gắng lưu một mô hình vào cơ sở dữ liệu, tôi nhận được một SecurityException.SecurityException: Không thể tìm thấy nhà cung cấp null cho người dùng 0; trên ActiveAndroid trên Android 8.0

Stack là:

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] 

Có ai khác có kinh nghiệm này? Chúng tôi có cần chỉ định Nhà cung cấp Nội dung trong AndroidManifest.xml không?

Xin lỗi nhưng tôi chưa có ví dụ riêng về điều này. Tôi sẽ làm việc để đặt một cái gì đó với nhau.

Cảm ơn trước

+2

"Không thể tìm thấy nhà cung cấp null "cho thấy một' Uri' không đúng định dạng, một chuỗi có chuỗi quyền hạn bị thiếu hoặc nghĩa đen là '" null "'. – CommonsWare

+0

Tôi nhận được cùng một sự cố, nhưng với một cái gì đó khác "null" là nhà cung cấp trong stacktrace. Không biết tại sao điều này xảy ra, nhưng nó chỉ xảy ra trên Android 8 ... – Otziii

+1

Điều này khiến tôi phát điên. Nhắm mục tiêu SDK 25 hoạt động tốt, nhắm mục tiêu 26+ sự cố với chính xác lỗi này. TÔI CÓ đặt quyền hạn trong Nhà cung cấp chính xác. Vẫn là vụ tai nạn này. Tao không biết cái quái gì về chuyện này. Tất nhiên, Uri của tôi không phải là vô ích khi gọi! Bây giờ bạn có gì mới không ?? – Zordid

Trả lời

-1

tôi đã có vấn đề chính xác cùng với android hoạt động trên Android O. Hóa ra rằng một trong những phương pháp trong tùy chỉnh của tôi ContentProvider trở một Uri, một số lần nó sẽ trả về null và điều này đã gây ra vấn đề. Vì vậy, tôi đã thêm chú thích @Nullable vào phương pháp như được hiển thị bên dưới để khắc phục sự cố.

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

Điều này không khắc phục được sự cố. –

0

Android O dường như đòi hỏi việc sử dụng một ContentProvider tùy chỉnh để sử dụng cơ sở dữ liệu, ngay cả khi bạn không có ý định chia sẻ dữ liệu của mình với các ứng dụng khác.

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

lớp tùy chỉnh của bạn phải được định nghĩa trong một thẻ nhà cung cấp trong thẻ ứng dụng của bạn trong AndroidManifest.xml. Nếu có thể, hãy đặt export = false để bảo vệ dữ liệu của bạn khỏi việc sử dụng bên ngoài.

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

Đối với tôi vấn đề phát sinh vì tôi đang gọi thông báoThay đổi nội dungResolver. Tôi đã không cần điều này, vì vậy tôi đã có thể tránh thực hiện một ContentProvider.

2

Như được chỉ ra bởi các thay đổi bảo mật @GeigerGeek trên Android 26 trở lên yêu cầu bạn chỉ định nhà cung cấp nội dung trong tệp kê khai của bạn.

Đối với ActiveAndroid, bạn có thể thêm phần bên dưới vào Tệp kê khai và thay đổi tên gói của mình.

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

Đối với các giải pháp nhiều hơn hoặc thông tin này được đưa from here.

0

Sửa Manifest và thêm thẻ này nút cung cấp dịch vụ tại nút ứng dụng phụ.

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

Tôi sử dụng tính năng này và sửa lỗi của tôi. Click here for demo.

0

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

Khi dự án đã xác định các lớp mô hình trong mã nguồn java thông qua ứng dụng phương pháp cấu hình addModelClasses vẫn sẽ được đâm lớp mô hình nguyên nhân sẽ không được nạp thông qua cấu hình đó. Trong tình huống đó, bạn cần di chuyển định nghĩa mô hình sang tệp 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(); 
}} 

Nếu bạn đang làm một cái gì đó với FileProvider, đừng bỏ lỡ để thay đổi tên gói

Uri contentUri = FileProvider.getUriForFile(mContext, 
      "your package name", new File(mImageFilePath)); 
Các vấn đề liên quan