READ_MEDIA_IMAGES, READ_MEDIA_VIDEO and the photo picker
Checked against Google's policy pages on .
- android.permission.READ_MEDIA_IMAGES
- android.permission.READ_MEDIA_VIDEO
What does it allow?
On Android 13 and higher, READ_MEDIA_IMAGES and READ_MEDIA_VIDEO give an app access to all of the user's photos and videos, not just the ones they choose to share. They replaced READ_EXTERNAL_STORAGE for media.
Which apps does Google Play allow to use it?
Google Play's Photo and Video Permissions policy limits these to "apps whose core functionality revolves around broad access to Photos and Videos": gallery apps and photo or video managers and editors are the usual examples.
An app with a one-time or infrequent need, such as choosing a profile picture or attaching an image to a message, is expected to use a system picker instead. Apps that keep the permissions must submit a Play Console declaration showing why the Android photo picker, or another alternative, is not enough.
Why is it in my app?
Image-picking and media libraries often request these permissions in their own manifest. If your app only lets people pick an image now and then, the permission is probably there because of such a library rather than anything your app needs.
To see every permission in your build and which ones may need a declaration, paste your merged manifest into the Play Console permission declaration checker.
What can I use instead?
Use the Android photo picker. The user picks the photos or videos to share, and your app gets only those, with no permission at all. Google notes it is available on Android 11 (API level 30) and higher and has been backported to Android 4.4 through Android 10.
In React Native, Flutter and Expo, check whether your image-picker package has a photo-picker mode, and remove the media permissions it added once you use it.
How do I remove it?
Add it to your own manifest with tools:node="remove". The manifest merge then leaves it out, whichever library declared it. In Flutter and React Native the file is android/app/src/main/AndroidManifest.xml.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove" />
</manifest>In Expo, block it in your app config instead:
{
"expo": {
"android": {
"blockedPermissions": [
"android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VIDEO"
]
}
}
}Then test the feature the library provides: if it needed the permission, that feature may stop working.
How do I declare it if I keep it?
If your app's core function needs broad access (a gallery, a photo backup or editing app), submit the Photo and Video Permissions declaration in Play Console explaining why the photo picker is not sufficient.
Common questions
- My app only needs a profile photo. Can I keep READ_MEDIA_IMAGES?
- Google's policy says apps with a one-time or infrequent need should use a system picker such as the Android photo picker. Switch to it and remove the permission.
- What about READ_EXTERNAL_STORAGE?
- On Android 13 and higher it no longer grants access to media, which is what the READ_MEDIA_* permissions are for. Cap it with android:maxSdkVersion="32" if older devices still need it.
- Does the photo picker need a permission?
- No. The user chooses what to share, and the app receives only those items.
Read next
ACCESS_BACKGROUND_LOCATION on Google Play
Location while the app is closed. Needs a core feature, a disclosure, a declaration and a video.
MANAGE_EXTERNAL_STORAGE (All files access) on Google Play
All files access. For file managers, backup, antivirus and similar apps only.
REQUEST_INSTALL_PACKAGES on Google Play
Ask to install other APKs. Never for self-updates; only when installing is a core feature.