2015-09-09 11 views
6

tôi có những quyền như tôi:Permission sự khước từ nào MediaDocumentsProvider

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

tôi nhận được một lỗi cho phép từ chối ở đây trên dòng openInputStream:

if(bgUri != null && !bgUri.isEmpty()) { 
      try { 
       InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(bgUri)); // <-- error 
       return Drawable.createFromStream(inputStream, bgUri); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 

đầu tiên tôi tải hình ảnh của tôi với

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    if (requestCode == SELECT_PHOTO && resultCode == Activity.RESULT_OK) { 
     try { 
      final Uri imageUri = imageReturnedIntent.getData(); 

      final int takeFlags = imageReturnedIntent.getFlags() 
        & (Intent.FLAG_GRANT_READ_URI_PERMISSION 
        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      // Check for the freshest data. 
      mContext.getContentResolver().takePersistableUriPermission(imageUri, takeFlags); 

sau đó lưu hình ảnh uri:

  String backgroundURI = imageUri.toString(); 
      int backgroundID = 0; 
      mStore.backgroundImageURI = backgroundURI; 
      mStore.backgroundImageNumber= backgroundID; 
      mStore.save(); 

Stack trace:

﹕ FATAL EXCEPTION: main 
Process: com.myapp.pocketandroid, PID: 1284 
java.lang.RuntimeException: Unable to resume activity {com.myapp.pocketandroid/com.myapp.pocketandroid.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2774) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238) 
     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
     at android.os.Parcel.readException(Parcel.java:1465) 
     at android.os.Parcel.readException(Parcel.java:1419) 
     at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2848) 
     at android.app.ActivityThread.acquireProvider(ActivityThread.java:4399) 
     at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2208) 
     at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425) 
     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1047) 
     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904) 
     at android.content.ContentResolver.openInputStream(ContentResolver.java:629) 
     at com.myapp.pocketandroid.Utils.BackgroundImageManager.background(BackgroundImageManager.java:29) 
     at com.myapp.pocketandroid.BaseActivity.setBackground(BaseActivity.java:83) 
     at com.myapp.pocketandroid.BaseActivity.onResume(BaseActivity.java:44) 

Tại sao tôi nhận được sự cho phép sụp đổ MediaDocumentsProvider khi tôi tiếp tục hoạt động của tôi và cố gắng để tải các URI? Tôi nghĩ rằng bằng cách cho phép tôi giữ quyền vĩnh viễn.

+0

Vui lòng đăng mã của bạn "cố gắng tải URI" cùng với dấu vết ngăn xếp hoàn chỉnh. – CommonsWare

+1

@CommonsGặp sự cố là trong khối mã đầu tiên. Tôi đã thêm một dấu vết ngăn xếp. – quantumpotato

+0

Bạn đang làm gì giữa việc gọi 'takePersistableUriPermission()' và 'openInputStream()'? Bạn đã viết rằng bạn nhận được sự cố này khi bạn "tiếp tục hoạt động của bạn". Bạn có nghĩa là điều này nghĩa đen (tức là, nó là cùng một ví dụ hoạt động như bạn đã sử dụng với 'takePersistableUriPermission()' và chỉ quay trở lại nền trước)? Hay bạn ám chỉ điều gì khác? – CommonsWare

Trả lời

1

Dường như bạn đang sử dụng "nhận dữ liệu mới nhất" từ hereSELECT_PHOTO từ here. Chính xác? Giả sử đó là trường hợp ---

Ví dụ SELECT_PHOTO sử dụng ACTION_PICK để chọn ảnh. Quoting:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

Tuy nhiên, như pointed out, Intent.ACTION_PICK có không đảm bảo về persistability. Thay vào đó, hãy sử dụng Intent.ACTION_OPEN_DOCUMENT. Từ số API docs, áp dụng cho API 19 trở lên:

Tất cả tài liệu được chọn sẽ được trả lại cho ứng dụng gọi điện với quyền cấp phép đọc và ghi liên tục. Nếu bạn muốn duy trì quyền truy cập vào các tài liệu trên các lần khởi động lại thiết bị, bạn cần phải sử dụng các quyền liên tục một cách rõ ràng bằng cách sử dụng takePersistableUriPermission (Uri, int).

Hãy thử

Intent photoPickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

và xem cách bạn làm.

+0

đang thử .. này ... – quantumpotato

+0

Sự cố vẫn xảy ra khi tải. – quantumpotato

+0

Vẫn còn lỗi tương tự? Bạn có thể gửi toàn bộ điều trên github hoặc một nơi nào đó? Vấn đề có thể nằm ngoài dấu ngoặc kép ở đây. – cxw

Các vấn đề liên quan