READ_MEDIA_IMAGES / VIDEO
Also known as: read media images permission, granular media access
READ_MEDIA_IMAGES and READ_MEDIA_VIDEO are granular Android runtime permissions introduced in Android 13 (API 33) that replace the broad READ_EXTERNAL_STORAGE for media. They let an app read only photos or only videos, instead of all shared storage. A cleaner requests them to scan your camera roll for duplicates and clutter.
- READ_MEDIA_IMAGES and READ_MEDIA_VIDEO landed in Android 13 (API 33), splitting the old READ_EXTERNAL_STORAGE by media type.
- Android 14 added READ_MEDIA_VISUAL_USER_SELECTED for granting access to a user-chosen subset of photos and videos.
- Apps targeting API 33+ must use these granular permissions; READ_EXTERNAL_STORAGE no longer grants media access there.
What changed in Android 13
Before Android 13 (API 33), reading any shared media required READ_EXTERNAL_STORAGE, which granted access to all media types at once. Android 13 split that into type-specific runtime permissions: READ_MEDIA_IMAGES for photos, READ_MEDIA_VIDEO for video, and READ_MEDIA_AUDIO for audio.
An app declares only the types it needs in AndroidManifest.xml and requests them at runtime. Media outside the granted type stays invisible to the app, reducing over-broad access and giving users clearer consent.
Partial access and newer versions
Android 14 (API 34) added READ_MEDIA_VISUAL_USER_SELECTED, a 'Select photos and videos' option letting users grant access to a chosen subset rather than the whole library, similar in spirit to iOS limited access. The app then sees only the user-picked items via MediaStore.
Apps targeting API 33+ must use these granular permissions; READ_EXTERNAL_STORAGE is ignored for media on those devices. For full-library cleaning, the app requests the broad grant; for the picker-only flow it works within the selected set.
How a cleaner uses them
A photo cleaner requests READ_MEDIA_IMAGES (and READ_MEDIA_VIDEO if it scans clips) so it can enumerate items through MediaStore, compute hashes, and flag duplicates, similar shots, and large files. It does not need audio access, so it omits READ_MEDIA_AUDIO.
Requesting only image and video scopes is the least-privilege approach and is what users see on the grant dialog before any scan begins.