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