From b5f53e771095f2c3c521008cb2c6555f5905b163 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 --- .../androidx/media3/common/util/Util.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index f80525bdf6..0ba8dcf428 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -55,6 +55,7 @@ import android.os.Handler; 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; @@ -219,8 +220,8 @@ public final class Util { return false; } for (Uri uri : uris) { - if (isLocalFileUri(uri)) { - return requestExternalStoragePermission(activity); + if (maybeRequestReadExternalStoragePermission(activity, uri)) { + return true; } } return false; @@ -245,18 +246,39 @@ public final class Util { 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.