From a90d5230e2856d08d1f7275b3d7244ed03fec466 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 10 Jun 2022 14:29:55 +0000 Subject: [PATCH] Fix permissions request for media provider content URIs We need to request the external storage permission to access these PiperOrigin-RevId: 454160546 --- .../google/android/exoplayer2/util/Util.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java index f32b869607c..dbbc7b73435 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -55,6 +55,7 @@ import android.os.Looper; import android.os.Parcel; import android.os.SystemClock; +import android.provider.MediaStore; import android.security.NetworkSecurityPolicy; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -215,8 +216,8 @@ public static boolean maybeRequestReadExternalStoragePermission(Activity activit return false; } for (Uri uri : uris) { - if (isLocalFileUri(uri)) { - return requestExternalStoragePermission(activity); + if (maybeRequestReadExternalStoragePermission(activity, uri)) { + return true; } } return false; @@ -241,18 +242,39 @@ public static boolean maybeRequestReadExternalStoragePermission( if (mediaItem.localConfiguration == null) { continue; } - if (isLocalFileUri(mediaItem.localConfiguration.uri)) { - return requestExternalStoragePermission(activity); + if (maybeRequestReadExternalStoragePermission(activity, mediaItem.localConfiguration.uri)) { + return true; } - for (int i = 0; i < mediaItem.localConfiguration.subtitleConfigurations.size(); i++) { - if (isLocalFileUri(mediaItem.localConfiguration.subtitleConfigurations.get(i).uri)) { - return requestExternalStoragePermission(activity); + List subtitleConfigs = + mediaItem.localConfiguration.subtitleConfigurations; + for (int i = 0; i < subtitleConfigs.size(); i++) { + if (maybeRequestReadExternalStoragePermission(activity, subtitleConfigs.get(i).uri)) { + return true; } } } return false; } + private static boolean maybeRequestReadExternalStoragePermission(Activity activity, Uri uri) { + return Util.SDK_INT >= 23 && (isLocalFileUri(uri) || isMediaStoreExternalContentUri(uri)) + ? requestExternalStoragePermission(activity) + : false; + } + + private static boolean isMediaStoreExternalContentUri(Uri uri) { + if (!"content".equals(uri.getScheme()) || !MediaStore.AUTHORITY.equals(uri.getAuthority())) { + return false; + } + List pathSegments = uri.getPathSegments(); + if (pathSegments.isEmpty()) { + return false; + } + String firstPathSegment = pathSegments.get(0); + return MediaStore.VOLUME_EXTERNAL.equals(firstPathSegment) + || MediaStore.VOLUME_EXTERNAL_PRIMARY.equals(firstPathSegment); + } + /** * Returns whether it may be possible to load the URIs of the given media items based on the * network security policy's cleartext traffic permissions.