Skip to content

Commit

Permalink
Fix permissions request for media provider content URIs
Browse files Browse the repository at this point in the history
We need to request the external storage permission to access these

PiperOrigin-RevId: 454160546
  • Loading branch information
ojw28 authored and marcbaechinger committed Jun 13, 2022
1 parent 92c2a30 commit a90d523
Showing 1 changed file with 29 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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<MediaItem.SubtitleConfiguration> 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<String> 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.
Expand Down

0 comments on commit a90d523

Please sign in to comment.