Предоставление разрешений uri для FileProvider предоставляет SecurityException

У меня есть 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 для пользователя?

Ответ 1

Вам нужно дать разрешение на приложение...

activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

Ответ 2

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)