Невозможно получить ContentResolver.openInputStream (Uri uri) в приложении с targetSdk 29 и compileSdk 29 на устройстве с API 29 - PullRequest
1 голос
/ 14 июля 2020

У меня работают два приложения на устройстве Android 10 (API 29) . Из первого приложения («отправитель») я отправляю изображение uri файла jpg, помещенного в файловую систему телефона:

Intent intent = new Intent(Intent.ACTION_VIEW);        
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
String mimeType = AppUtils.getFileMimeType(uri, context);
intent.setDataAndType(uri, "image/jpeg");
if (intent.resolveActivity(context.getPackageManager()) != null)
    context.startActivity(Intent.createChooser(intent, "Open with"));

Во втором приложении («получатель») я пытаюсь откройте InputStream сверху uri:

context.getContentResolver().openInputStream(uri);

и получите в результате это исключение:

java.lang.SecurityException: Permission Denial: reading com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/tree/primary%3AMovies%2FNew/document/primary%3AMovies%2FNew%2FPanorama.jpg from pid=30753, uid=10487 requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
    at android.os.Parcel.createException(Parcel.java:2071)
    at android.os.Parcel.readException(Parcel.java:2039)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151)
    at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:705)
    at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1687)
    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503)
    at android.content.ContentResolver.openInputStream(ContentResolver.java:1187)

Нет проблем, если эти два приложения работают на Android 9 (API 28) устройство. Что изменилось в Android 10 (API 29) в отношении доступа через Intent.ACTION_VIEW и ContentResolver.openInputStream к uri из сторонних приложений!?

Приложение «Отправитель»

compileSdkVersion 30
targetSdkVersion 30

Приложение «Получатель» содержит

compileSdkVersion 29
targetSdkVersion 29

и android:requestLegacyExternalStorage="true" в Manifest.

1 Ответ

0 голосов
/ 15 июля 2020

Похоже, что Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION следует добавить, когда «Отправитель» отправляет intent на Android 10 (API 29) , но причина, по которой это не требуется для Android 9 (API 28) неясно.

Intent intent = new Intent(Intent.ACTION_VIEW);        
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
String mimeType = AppUtils.getFileMimeType(uri, context);
intent.setDataAndType(uri, "image/jpeg");
if (intent.resolveActivity(context.getPackageManager()) != null)
    context.startActivity(Intent.createChooser(intent, "Open with"));
...