Fix permissions request for media provider content URIs

We need to request the external storage permission to access these

PiperOrigin-RevId: 454160546
This commit is contained in:
olly 2022-06-10 14:29:55 +00:00 committed by Marc Baechinger
parent d6a6b44715
commit b5f53e7710

View File

@ -55,6 +55,7 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Parcel; import android.os.Parcel;
import android.os.SystemClock; import android.os.SystemClock;
import android.provider.MediaStore;
import android.security.NetworkSecurityPolicy; import android.security.NetworkSecurityPolicy;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
@ -219,8 +220,8 @@ public final class Util {
return false; return false;
} }
for (Uri uri : uris) { for (Uri uri : uris) {
if (isLocalFileUri(uri)) { if (maybeRequestReadExternalStoragePermission(activity, uri)) {
return requestExternalStoragePermission(activity); return true;
} }
} }
return false; return false;
@ -245,18 +246,39 @@ public final class Util {
if (mediaItem.localConfiguration == null) { if (mediaItem.localConfiguration == null) {
continue; continue;
} }
if (isLocalFileUri(mediaItem.localConfiguration.uri)) { if (maybeRequestReadExternalStoragePermission(activity, mediaItem.localConfiguration.uri)) {
return requestExternalStoragePermission(activity); return true;
} }
for (int i = 0; i < mediaItem.localConfiguration.subtitleConfigurations.size(); i++) { List<MediaItem.SubtitleConfiguration> subtitleConfigs =
if (isLocalFileUri(mediaItem.localConfiguration.subtitleConfigurations.get(i).uri)) { mediaItem.localConfiguration.subtitleConfigurations;
return requestExternalStoragePermission(activity); for (int i = 0; i < subtitleConfigs.size(); i++) {
if (maybeRequestReadExternalStoragePermission(activity, subtitleConfigs.get(i).uri)) {
return true;
} }
} }
} }
return false; 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 * 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. * network security policy's cleartext traffic permissions.