Ответ 1
Вам нужно дать разрешение на приложение...
activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
У меня есть 2 приложения - Демо и Pro. У Demo есть контент-провайдер, и когда Pro установлен, ему необходимо перенести все файлы из демо-провайдера.
Демо-приложение (поставщик):
<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>
Про приложение (потребитель):
Эксперимент 1:
ParcelFileDescriptor pfd = cr.openFileDescriptor(visibleFileUri, "r" );
FileInputStream input = new FileInputStream (pfd.getFileDescriptor());
java.lang.SecurityException: отказ в разрешении: открытие провайдера .provider.InternalStorageProvider от ProcessRecord {9c85875 10734:/u0a61} (pid = 10734, uid = 10061), который не экспортируется из uid 10062
Эксперимент 2:
Активность активности = getActivity(); activity.grantUriPermission(activity.getPackageName(), protectedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
ParcelFileDescriptor pfd = cr.openFileDescriptor(visibleFileUri, "r" ); FileInputStream input = new FileInputStream (pfd.getFileDescriptor());
java.lang.SecurityException: Uid 10061 не имеет разрешения на uri 0 @content://***.demo.storage.int.provider/db/file1
InternalStorageProvider
является копией нормального FileProvider
. Но это не имеет значения, так как исполнение даже не может достичь этого. Исключения выбрасываются до их вызова.
Обратите внимание, что никаких действий и намерений выбора нет. Пользователь пытается открыть файл из известного uri напрямую, без выбора. Большинство примеров, которые я нашел, используют Intent.FLAG_GRANT_READ_URI_PERMISSION
, но я вообще не использую намерения.
Как я должен правильно предоставлять разрешения uri для пользователя?
Вам нужно дать разрешение на приложение...
activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
java.lang.SecurityException: UID 10147 не имеет разрешения на доступ к uri 0 @content://com.miui.gallery.open/raw/%2Fstorage%2F0000-5B06%2Fvideos%2Fdownload%2FHrudhayam_yeto_poyene_video_from_Happy_Movie.App.os.p..readException(Parcel.java:1684) на android.os.Parcel.readException(Parcel.java:1637) на android.app.ActivityManagerProxy.grantUriPermission(ActivityManagerNative.java:4915) на android.app.ContextImpl.grantUriPermission(ContextImplmp. Java: 1664) в android.content.ContextWrapper.grantUriPermission(ContextWrapper.java:722) в in.mohalla.sharechat.compose.service.PostUploadWork.startUploading(PostUploadWork.kt: 140) в in.mohalla.sharechat.compose.service.PostUploadWork.startWithDraft(PostUploadWork.kt: 93) в in.mohalla.sharechat.compose.service.PostUploadWork.doWork(PostUploadWork.kt: 80) в androidx.work.Worker $ 1.run(Worker.java:57) в Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) в java.util.concurrent.ThreadPoo lExecutor $ Worker.run(ThreadPoolExecutor.java:607) в java.lang.Thread.run(Thread.java:760)