6

Tôi có 2 ứng dụng - DemoPro. Demo có một nhà cung cấp nội dung và khi Pro được cài đặt, nó cần phải chuyển tất cả các tệp từ nhà cung cấp bản demo.Cấp quyền uri cho FileProvider cung cấp cho SecurityException

ứng dụng Demo (nhà cung cấp):

<provider 
      android:name="***.provider.InternalStorageProvider" 
      android:authorities="***.demo.storage.int.provider" 
      android:exported="false" 
      android:syncable="true" 
      android:grantUriPermissions="true"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/int_storage_paths" /> 

</provider> 

Pro ứng dụng (tiêu dùng):

  • Thí nghiệm 1:

    ParcelFileDescriptor pfd = cr.openFileDescriptor (exposedFileUri, "r");
    FileInputStream input = new FileInputStream (pfd.getFileDescriptor());

java.lang.SecurityException: Permission từ chối: nhà cung cấp mở .provider.InternalStorageProvider từ ProcessRecord {9c85875 10.734:/u0a61} (pid = 10.734, uid = 10061) mà không được xuất khẩu từ uid 10062

  • Thí nghiệm 2:

    Hoạt động hoạt động = getActivity(); activity.grantUriPermission (activity.getPackageName(), exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

    ParcelFileDescriptor pfd = cr.openFileDescriptor (exposedFileUri, "r"); FileInputStream input = new FileInputStream (pfd.getFileDescriptor());

java.lang.SecurityException: Uid 10061 không có quyền Uri 0 @ nội dung: //***.demo.storage.int.provider/db/file1

InternalStorageProvider là bản sao của thông thường FileProvider. Nhưng nó không quan trọng như việc thực hiện thậm chí không thể đạt được nó. Các ngoại lệ được ném trước khi nó được gọi. Lưu ý rằng không có hoạt động và mục đích của trình chọn cho phép. Người tiêu dùng cố gắng mở tệp từ một uri đã biết trực tiếp, mà không cần chọn lựa. Hầu hết các ví dụ tôi đã tìm thấy đang sử dụng Intent.FLAG_GRANT_READ_URI_PERMISSION nhưng tôi không sử dụng ý định nào cả.

Làm cách nào để cấp quyền cho người tiêu dùng một cách chính xác?

+0

Chạy về vấn đề này ngay bây giờ, bởi bất kỳ cơ hội bạn đã có thể giải quyết nó? –

+0

Nó đã được khá lâu trước đây, tôi hầu như không nhớ bất cứ điều gì. Thứ này thật là tà ác. – WindRider

+0

Giải quyết nó bằng cách chuyển 'FLAG_GRANT_READ_URI_PERMISSION' đến hoàn toàn mọi ý định khác đang sử dụng URI bên trong ứng dụng của tôi –

Trả lời

1

Bạn cần phải cung cấp cho phép ứng dụng chuyên nghiệp ...

activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
Các vấn đề liên quan