Tôi có 2 ứng dụng - Demo và Pro. 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?
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ó? –
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
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 –