File: media-library.md | Updated: 11/15/2025
Hide navigation
Search
Ctrl K
Home Guides EAS Reference Learn
Reference version
SDK 52
Archive Expo Snack Discord and Forums Newsletter
Expo MediaLibraryA library that provides access to the device's media library.
Android
iOS
Bundled version:
~17.0.6
Copy page
expo-media-library provides access to the user's media library, allowing them to access their existing images and videos from your app, as well as save new ones. You can also subscribe to any updates made to the user's media library.
Android allows full access to the media library (which is the purpose of this package) only for applications needing broad access to photos. See Details on Google Play's Photo and Video Permissions policy .
Terminal
Copy
-Β npx expo install expo-media-library
If you are installing this in an existing React Native app
, make sure to install expo
in your project.
You can configure expo-media-library using its built-in config plugin
if you use config plugins in your project (Continuous Native Generation (CNG)
). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect. If your app does not use CNG, then you'll need to manually configure the library.
{ "expo": { "plugins": [ [ "expo-media-library", { "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.", "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos.", "isAccessMediaLocationEnabled": true } ] ] } }
| Name | Default | Description |
| --- | --- | --- |
| photosPermission | "Allow $(PRODUCT_NAME) to access your photos." | Only for:β<br><br>iOS<br><br> <br><br>Sets the iOS NSPhotoLibraryUsageDescription permission message in Info.plist. |
| savePhotosPermission | "Allow $(PRODUCT_NAME) to save photos." | Only for:β<br><br>iOS<br><br> <br><br>Sets the iOS NSPhotoLibraryAddUsageDescription permission message in Info.plist. |
| isAccessMediaLocationEnabled | false | Only for:β<br><br>Android<br><br> <br><br>Sets whether or not to request the ACCESS_MEDIA_LOCATION permission on Android. |
Are you using this library in an existing React Native app?
If you're not using Continuous Native Generation (CNG ) or you're using native android and ios projects manually, then you need to add following permissions and configuration to your native projects:
Android
To access asset location (latitude and longitude EXIF tags), add ACCESS_MEDIA_LOCATION permission to your project's android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
Scoped storage
is available from Android 10. To make expo-media-library work with scoped storage, you need to add the following configuration to your android/app/src/main/AndroidManifest.xml:
<manifest ... > <application android:requestLegacyExternalStorage="true" ...> </manifest>
iOS
Add NSPhotoLibraryUsageDescription, and NSPhotoLibraryAddUsageDescription keys to your project's ios/[app]/Info.plist:
<key>NSPhotoLibraryUsageDescription</key> <string>Give $(PRODUCT_NAME) permission to access your photos</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>Give $(PRODUCT_NAME) permission to save photos</string>
Fetching albums and displaying assets
Copy
Open in Snack
import { useState, useEffect } from 'react'; import { Button, Text, SafeAreaView, ScrollView, StyleSheet, Image, View, Platform } from 'react-native'; import * as MediaLibrary from 'expo-media-library'; export default function App() { const [albums, setAlbums] = useState(null); const [permissionResponse, requestPermission] = MediaLibrary.usePermissions(); async function getAlbums() { if (permissionResponse.status !== 'granted') { await requestPermission(); } const fetchedAlbums = await MediaLibrary.getAlbumsAsync({ includeSmartAlbums: true, }); setAlbums(fetchedAlbums); } return ( <SafeAreaView style={styles.container}> <Button onPress={getAlbums} title="Get albums" /> <ScrollView> {albums && albums.map((album) => <AlbumEntry album={album} />)} </ScrollView> </SafeAreaView> ); } function AlbumEntry({ album }) { const [assets, setAssets] = useState([]); useEffect(() => { async function getAlbumAssets() { const albumAssets = await MediaLibrary.getAssetsAsync({ album }); setAssets(albumAssets.assets); } getAlbumAssets(); }, [album]); return ( <View key={album.id} style={styles.albumContainer}> <Text> {album.title} - {album.assetCount ?? 'no'} assets </Text> <View style={styles.albumAssetsContainer}> {assets && assets.map((asset) => ( <Image source={{ uri: asset.uri }} width={50} height={50} /> ))} </View> </View> ); } %%placeholder-start%%const styles = StyleSheet.create({ ... }); %%placeholder-end%%const styles = StyleSheet.create({ container: { flex: 1, gap: 8, justifyContent: 'center', ...Platform.select({ android: { paddingTop: 40, }, }), }, albumContainer: { paddingHorizontal: 20, marginBottom: 12, gap: 4, }, albumAssetsContainer: { flexDirection: 'row', flexWrap: 'wrap', }, });
Show More
import * as MediaLibrary from 'expo-media-library';
getAlbumsAsyncAndroid
iOS
Type: React.[Element](https://www.typescriptlang.org/docs/handbook/jsx.html#function-component) <[AlbumsOptions](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumsoptions) >
Queries for user-created albums in media gallery.
MediaLibrary.MediaTypeAndroid
iOS
Type: [MediaTypeObject](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#mediatypeobject)
Possible media types.
MediaLibrary.SortByAndroid
iOS
Type: [SortByObject](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#sortbyobject)
Supported keys that can be used to sort getAssetsAsync results.
usePermissions(options)Android
iOS
| Parameter | Type |
| --- | --- |
| options(optional) | PermissionHookOptions<{ granularPermissions: [GranularPermission[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#granularpermission) , writeOnly: boolean }> |
Check or request permissions to access the media library. This uses both requestPermissionsAsync and getPermissionsAsync to interact with the permissions.
Returns:
[null | PermissionResponse, RequestPermissionMethod<PermissionResponse>, GetPermissionMethod<PermissionResponse>]
Example
const [permissionResponse, requestPermission] = MediaLibrary.usePermissions();
MediaLibrary.addAssetsToAlbumAsync(assets, album, copy)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| assets | [AssetRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) \| [AssetRef[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) | An array of Asset<br> or their IDs. |
| album | [AlbumRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) | An Album<br> or its ID. |
| copy(optional) | boolean | Android only. Whether to copy assets to the new album instead of move them. Defaults to true.<br><br>Default:true |
Adds array of assets to the album.
On Android, by default it copies assets from the current album to provided one, however it's also possible to move them by passing false as copyAssets argument. In case they're copied you should keep in mind that getAssetsAsync will return duplicated assets.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <boolean>
Returns promise which fulfils with true if the assets were successfully added to the album.
MediaLibrary.albumNeedsMigrationAsync(album)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| album | [AlbumRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) | An Album<br> or its ID. |
Checks if the album should be migrated to a different location. In other words, it checks if the application has the write permission to the album folder. If not, it returns true, otherwise false.
Note: For Android below R, web or iOS, this function always returns
false.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <boolean>
Returns a promise which fulfils with true if the album should be migrated.
MediaLibrary.createAlbumAsync(albumName, asset, copyAsset)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| albumName | string | Name of the album to create. |
| asset(optional) | [AssetRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) | An Asset<br> or its ID (required on Android). |
| copyAsset(optional) | boolean | Android Only. Whether to copy asset to the new album instead of move it. Defaults to true.<br><br>Default:true |
Creates an album with given name and initial asset. The asset parameter is required on Android, since it's not possible to create empty album on this platform. On Android, by default it copies given asset from the current album to the new one, however it's also possible to move it by passing false as copyAsset argument. In case it's copied you should keep in mind that getAssetsAsync will return duplicated asset.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <[Album](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#album) >
Newly created Album
.
MediaLibrary.createAssetAsync(localUri)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| localUri | string | A URI to the image or video file. It must contain an extension. On Android it must be a local path, so it must start with file:/// |
Creates an asset from existing file. The most common use case is to save a picture taken by Camera
. This method requires CAMERA_ROLL permission.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <[Asset](https://docs.expo.dev/versions/latest/sdk/asset#asset) >
A promise which fulfils with an object representing an Asset
.
Example
const { uri } = await Camera.takePictureAsync(); const asset = await MediaLibrary.createAssetAsync(uri);
MediaLibrary.deleteAlbumsAsync(albums, assetRemove)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| albums | [AlbumRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) \| [AlbumRef[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) | An array of Album<br>s or their IDs. |
| assetRemove(optional) | boolean | iOS Only. Whether to also delete assets belonging to given albums. Defaults to false.<br><br>Default:false |
Deletes given albums from the library. On Android by default it deletes assets belonging to given albums from the library. On iOS it doesn't delete these assets, however it's possible to do by passing true as deleteAssets.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <boolean>
Returns a promise which fulfils with true if the albums were successfully deleted from the library.
MediaLibrary.deleteAssetsAsync(assets)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| assets | [AssetRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) \| [AssetRef[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) | An array of Asset<br> or their IDs. |
Deletes assets from the library. On iOS it deletes assets from all albums they belong to, while on Android it keeps all copies of them (album is strictly connected to the asset). Also, there is additional dialog on iOS that requires user to confirm this action.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <boolean>
Returns promise which fulfils with true if the assets were successfully deleted.
MediaLibrary.getAlbumAsync(title)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| title | string | Name of the album to look for. |
Queries for an album with a specific name.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <[Album](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#album) >
An object representing an Album
, if album with given name exists, otherwise returns null.
MediaLibrary.getAssetInfoAsync(asset, options)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| asset | [AssetRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) | An Asset<br> or its ID. |
| options(optional) | [MediaLibraryAssetInfoQueryOptions](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#medialibraryassetinfoqueryoptions) | - |
Provides more information about an asset, including GPS location, local URI and EXIF metadata.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <[AssetInfo](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetinfo) >
An AssetInfo
object, which is an Asset extended by an additional fields.
MediaLibrary.getAssetsAsync(assetsOptions)Android
iOS
| Parameter | Type |
| --- | --- |
| assetsOptions(optional) | [AssetsOptions](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetsoptions) |
Fetches a page of assets matching the provided criteria.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <[PagedInfo](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#pagedinfo) <[Asset](https://docs.expo.dev/versions/latest/sdk/asset#asset) >>
A promise that fulfils with to PagedInfo
object with array of Asset
s.
MediaLibrary.getMomentsAsync()iOS
Fetches a list of moments, which is a group of assets taken around the same place and time.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <any>
An array of albums
whose type is moment.
MediaLibrary.getPermissionsAsync(writeOnly, granularPermissions)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| writeOnly(optional) | boolean | Default:false |
| granularPermissions(optional) | [GranularPermission[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#granularpermission) | A list of GranularPermission<br> values. This parameter has an effect only on Android 13 and newer. By default, expo-media-library will ask for all possible permissions. |
Checks user's permissions for accessing media library.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <PermissionResponse>
A promise that fulfils with PermissionResponse
object.
MediaLibrary.isAvailableAsync()Android
iOS
Returns whether the Media Library API is enabled on the current device.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <boolean>
A promise which fulfils with a boolean, indicating whether the Media Library API is available on the current device.
MediaLibrary.migrateAlbumIfNeededAsync(album)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| album | [AlbumRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) | An Album<br> or its ID. |
Moves album content to the special media directories on Android R or above if needed. Those new locations are in line with the Android scoped storage - so your application won't lose write permission to those directories in the future.
This method does nothing if:
The migration is possible when the album contains only compatible files types. For instance, movies and pictures are compatible with each other, but music and pictures are not. If automatic migration isn't possible, the function rejects. In that case, you can use methods from the expo-file-system to migrate all your files manually.
Android R introduced a lot of changes in the storage system. Now applications can't save anything to the root directory. The only available locations are from the MediaStore API. Unfortunately, the media library stored albums in folders for which, because of those changes, the application doesn't have permissions anymore. However, it doesn't mean you need to migrate all your albums. If your application doesn't add assets to albums, you don't have to migrate. Everything will work as it used to. You can read more about scoped storage in the Android documentation
.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <void>
A promise which fulfils to void.
MediaLibrary.presentPermissionsPickerAsync(mediaTypes)Android 14+
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| mediaTypes(optional) | [MediaTypeFilter[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#mediatypefilter) | Limits the type(s) of media that the user will be granting access to. By default, a list that shows both photos and videos is presented. |
Allows the user to update the assets that your app has access to. The system modal is only displayed if the user originally allowed only limited access to their media library, otherwise this method is a no-op.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <void>
A promise that either rejects if the method is unavailable, or resolves to void.
Note: This method doesn't inform you if the user changes which assets your app has access to. That information is only exposed by iOS, and to obtain it, you need to subscribe for updates to the user's media library using
addListener(). IfhasIncrementalChangesisfalse, the user changed their permissions.
MediaLibrary.removeAssetsFromAlbumAsync(assets, album)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| assets | [AssetRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) \| [AssetRef[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) | An array of Asset<br> or their IDs. |
| album | [AlbumRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) | An Album<br> or its ID. |
Removes given assets from album.
On Android, album will be automatically deleted if there are no more assets inside.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <boolean>
Returns promise which fulfils with true if the assets were successfully removed from the album.
MediaLibrary.removeSubscription(subscription)Android
iOS
| Parameter | Type |
| --- | --- |
| subscription | EventSubscription |
Returns:
void
MediaLibrary.requestPermissionsAsync(writeOnly, granularPermissions)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| writeOnly(optional) | boolean | Default:false |
| granularPermissions(optional) | [GranularPermission[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#granularpermission) | A list of GranularPermission<br> values. This parameter has an effect only on Android 13 and newer. By default, expo-media-library will ask for all possible permissions. |
Asks the user to grant permissions for accessing media in user's media library.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <PermissionResponse>
A promise that fulfils with PermissionResponse
object.
MediaLibrary.saveToLibraryAsync(localUri)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| localUri | string | A URI to the image or video file. It must contain an extension. On Android it must be a local path, so it must start with file:///. |
Saves the file at given localUri to the user's media library. Unlike createAssetAsync()
, This method doesn't return created asset. On iOS 11+, it's possible to use this method without asking for CAMERA_ROLL permission, however then yours Info.plist should have NSPhotoLibraryAddUsageDescription key.
Returns:
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) <void>
MediaLibrary.addListener(listener)Android
iOS
| Parameter | Type | Description |
| --- | --- | --- |
| listener | (event: [MediaLibraryAssetsChangeEvent](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#medialibraryassetschangeevent) ) => void | A callback that is fired when any assets have been inserted or deleted from the library. On Android it's invoked with an empty object. On iOS, it's invoked with MediaLibraryAssetsChangeEvent<br> object.<br><br>Additionally, only on iOS, the listener is also invoked when the user changes access to individual assets in the media library using presentPermissionsPickerAsync(). |
Subscribes for updates in user's media library.
Returns:
EventSubscription
An Subscription
object that you can call remove() on when you would like to unsubscribe the listener.
MediaLibrary.removeAllListeners()Android
iOS
Removes all listeners.
Returns:
void
EXPermissionResponseAndroid
iOS
An object obtained by permissions get and request functions.
| Property | Type | Description |
| --- | --- | --- |
| canAskAgain | boolean | Indicates if user can be asked again for specific permission. If not, one should be directed to the Settings app in order to enable/disable the permission. |
| expires | [PermissionExpiration](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#permissionexpiration) | Determines time when the permission expires. |
| granted | boolean | A convenience boolean that indicates if the permission is granted. |
| status | [PermissionStatus](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#permissionstatus) | Determines the status of the permission. |
AlbumAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| approximateLocation(optional) | [Location](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#location) | Only for:β<br><br>iOS<br><br> <br><br>Apply only to albums whose type is 'moment'. Approximated location of all assets in the moment. |
| assetCount | number | Estimated number of assets in the album. |
| endTime | number | Only for:β<br><br>iOS<br><br> <br><br>Apply only to albums whose type is 'moment'. Latest creation timestamp of all assets in the moment. |
| id | string | Album ID. |
| locationNames(optional) | string[] | Only for:β<br><br>iOS<br><br> <br><br>Apply only to albums whose type is 'moment'. Names of locations grouped in the moment. |
| startTime | number | Only for:β<br><br>iOS<br><br> <br><br>Apply only to albums whose type is 'moment'. Earliest creation timestamp of all assets in the moment. |
| title | string | Album title. |
| type(optional) | [AlbumType](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumtype) | Only for:β<br><br>iOS<br><br> <br><br>The type of the assets album. |
AlbumRefAndroid
iOS
Literal Type: union
Acceptable values are: [Album](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#album) | string
AlbumsOptionsAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| includeSmartAlbums(optional) | boolean | - |
AlbumTypeAndroid
iOS
Literal Type: string
Acceptable values are: 'album' | 'moment' | 'smartAlbum'
AssetAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| albumId(optional) | string | Only for:β<br><br>Android<br><br> <br><br>Album ID that the asset belongs to. |
| creationTime | number | File creation timestamp. |
| duration | number | Duration of the video or audio asset in seconds. |
| filename | string | Filename of the asset. |
| height | number | Height of the image or video. |
| id | string | Internal ID that represents an asset. |
| mediaSubtypes(optional) | [MediaSubtype[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#mediasubtype) | Only for:β<br><br>iOS<br><br> <br><br>An array of media subtypes. |
| mediaType | [MediaTypeValue](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#mediatypevalue) | Media type. |
| modificationTime | number | Last modification timestamp. |
| uri | string | URI that points to the asset. ph://* (iOS), file://* (Android) |
| width | number | Width of the image or video. |
AssetInfoAndroid
iOS
Type: [Asset](https://docs.expo.dev/versions/latest/sdk/asset#asset) extended by:
| Property | Type | Description |
| --- | --- | --- |
| exif(optional) | object | EXIF metadata associated with the image. |
| isFavorite(optional) | boolean | Only for:β<br><br>iOS<br><br> <br><br>Whether the asset is marked as favorite. |
| isNetworkAsset(optional) | boolean | Only for:β<br><br>iOS<br><br> <br><br>This field is available only if flag shouldDownloadFromNetwork is set to false. Whether the asset is stored on the network (iCloud on iOS). |
| localUri(optional) | string | Local URI for the asset. |
| location(optional) | [Location](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#location) | GPS location if available. |
| orientation(optional) | number | Only for:β<br><br>iOS<br><br> <br><br>Display orientation of the image. Orientation is available only for assets whose mediaType is MediaType.photo. Value will range from 1 to 8, see EXIF orientation specification<br> for more details. |
AssetRefAndroid
iOS
Literal Type: union
Acceptable values are: [Asset](https://docs.expo.dev/versions/latest/sdk/asset#asset) | string
AssetsOptionsAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| after(optional) | [AssetRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#assetref) | Asset ID of the last item returned on the previous page. To get the ID of the next page, pass endCursor<br> as its value. |
| album(optional) | [AlbumRef](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#albumref) | Album<br> or its ID to get assets from specific album. |
| createdAfter(optional) | [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) \| number | Date object or Unix timestamp in milliseconds limiting returned assets only to those that were created after this date. |
| createdBefore(optional) | [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) \| number | Similarly as createdAfter, but limits assets only to those that were created before specified date. |
| first(optional) | number | The maximum number of items on a single page.<br><br>Default:20 |
| mediaType(optional) | [MediaTypeValue[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#mediatypevalue) \| [MediaTypeValue](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#mediatypevalue) | An array of MediaTypeValue<br>s or a single MediaTypeValue.<br><br>Default:MediaType.photo |
| sortBy(optional) | [SortByValue[]](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#sortbyvalue) \| [SortByValue](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#sortbyvalue) | An array of SortByValue<br>s or a single SortByValue value. By default, all keys are sorted in descending order, however you can also pass a pair [key, ascending] where the second item is a boolean value that means whether to use ascending order. Note that if the SortBy.default key is used, then ascending argument will not matter. Earlier items have higher priority when sorting out the results. If empty, this method uses the default sorting that is provided by the platform. |
GranularPermissionAndroid 13+
Literal Type: string
Determines the type of media that the app will ask the OS to get access to.
Acceptable values are: 'audio' | 'photo' | 'video'
LocationAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| latitude | number | - |
| longitude | number | - |
MediaLibraryAssetInfoQueryOptionsAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| shouldDownloadFromNetwork(optional) | boolean | Whether allow the asset to be downloaded from network. Only available in iOS with iCloud assets.<br><br>Default:true |
MediaLibraryAssetsChangeEventAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| deletedAssets(optional) | [Asset[]](https://docs.expo.dev/versions/latest/sdk/asset#asset) | Available only if hasIncrementalChanges is true. Array of Asset<br>s that have been deleted from the library. |
| hasIncrementalChanges | boolean | Whether the media library's changes could be described as "incremental changes". true indicates the changes are described by the insertedAssets, deletedAssets and updatedAssets values. false indicates that the scope of changes is too large and you should perform a full assets reload (eg. a user has changed access to individual assets in the media library). |
| insertedAssets(optional) | [Asset[]](https://docs.expo.dev/versions/latest/sdk/asset#asset) | Available only if hasIncrementalChanges is true. Array of Asset<br>s that have been inserted to the library. |
| updatedAssets(optional) | [Asset[]](https://docs.expo.dev/versions/latest/sdk/asset#asset) | Available only if hasIncrementalChanges is true. Array of Asset<br>s that have been updated or completed downloading from network storage (iCloud on iOS). |
MediaSubtypeAndroid
iOS
Literal Type: string
Constants identifying specific variations of asset media, such as panorama or screenshot photos, and time-lapse or high-frame-rate video. Maps to these values .
Acceptable values are: 'depthEffect' | 'hdr' | 'highFrameRate' | 'livePhoto' | 'panorama' | 'screenshot' | 'stream' | 'timelapse'
MediaTypeFilterAndroid 14+
Literal Type: string
Represents the possible types of media that the app will ask the OS to get access to when calling presentPermissionsPickerAsync()
.
Acceptable values are: 'photo' | 'video'
MediaTypeObjectAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| audio | 'audio' | - |
| photo | 'photo' | - |
| unknown | 'unknown' | - |
| video | 'video' | - |
MediaTypeValueAndroid
iOS
Literal Type: string
Acceptable values are: 'audio' | 'photo' | 'video' | 'unknown'
PagedInfoAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| assets | T[] | A page of Asset<br>s fetched by the query. |
| endCursor | string | ID of the last fetched asset. It should be passed as after option in order to get the next page. |
| hasNextPage | boolean | Whether there are more assets to fetch. |
| totalCount | number | Estimated total number of assets that match the query. |
PermissionExpirationAndroid
iOS
Literal Type: union
Permission expiration time. Currently, all permissions are granted permanently.
Acceptable values are: 'never' | number
PermissionHookOptionsAndroid
iOS
Literal Type: union
Acceptable values are: PermissionHookBehavior | Options
PermissionResponseAndroid
iOS
Type: [EXPermissionResponse](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#expermissionresponse) extended by:
| Property | Type | Description |
| --- | --- | --- |
| accessPrivileges(optional) | 'all' \| 'limited' \| 'none' | Indicates if your app has access to the whole or only part of the photo library. Possible values are:<br><br>* 'all' if the user granted your app access to the whole photo library<br>* 'limited' if the user granted your app access only to selected photos (only available on Android API 14+ and iOS 14.0+)<br>* 'none' if user denied or hasn't yet granted the permission |
SortByKeyAndroid
iOS
Literal Type: string
Acceptable values are: 'default' | 'mediaType' | 'width' | 'height' | 'creationTime' | 'modificationTime' | 'duration'
SortByObjectAndroid
iOS
| Property | Type | Description |
| --- | --- | --- |
| creationTime | 'creationTime' | - |
| default | 'default' | - |
| duration | 'duration' | - |
| height | 'height' | - |
| mediaType | 'mediaType' | - |
| modificationTime | 'modificationTime' | - |
| width | 'width' | - |
SortByValueAndroid
iOS
Literal Type: union
Acceptable values are: [[SortByKey](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#sortbykey) , boolean] | [SortByKey](https://docs.expo.dev/versions/v52.0.0/sdk/media-library#sortbykey)
SubscriptionAndroid
iOS
A subscription object that allows to conveniently remove an event listener from the emitter.
| Property | Type | Description |
| --- | --- | --- |
| remove | () => void | Removes an event listener for which the subscription has been created. After calling this function, the listener will no longer receive any events from the emitter. |
PermissionStatusAndroid
iOS
DENIEDPermissionStatus.DENIED οΌ "denied"
User has denied the permission.
GRANTEDPermissionStatus.GRANTED οΌ "granted"
User has granted the permission.
UNDETERMINEDPermissionStatus.UNDETERMINED οΌ "undetermined"
User hasn't granted or denied the permission yet.
The following permissions are added automatically through this library's AndroidManifest.xml:
| Android Permission | Description |
| --- | --- |
| READ_EXTERNAL_STORAGE | Allows an application to read from external storage. |
| WRITE_EXTERNAL_STORAGE | Allows an application to write to external storage. |
| READ_MEDIA_IMAGES | Allows an application to read image files from external storage. |
| READ_MEDIA_VIDEO | Allows an application to read video files from external storage. |
| READ_MEDIA_AUDIO | Allows an application to read audio files from external storage. |
| READ_MEDIA_VISUAL_USER_SELECTED | Allows an application to read image or video files from external storage that a user has selected via the permission prompt photo picker.<br><br>> Apps can check this permission to verify that a user has decided to use the photo picker, instead of granting access to [READ_MEDIA_IMAGES](https://developer.android.com/reference/android/Manifest.permission#READ_MEDIA_IMAGES) or [READ_MEDIA_VIDEO](https://developer.android.com/reference/android/Manifest.permission#READ_MEDIA_VIDEO) . It does not prevent apps from accessing the standard photo picker manually. This permission should be requested alongside [READ_MEDIA_IMAGES](https://developer.android.com/reference/android/Manifest.permission#READ_MEDIA_IMAGES) and/or [READ_MEDIA_VIDEO](https://developer.android.com/reference/android/Manifest.permission#READ_MEDIA_VIDEO) , depending on which type of media is desired. |
The following usage description keys are used by this library:
| Info.plist Key | Description |
| --- | --- |
| NSPhotoLibraryUsageDescription | A message that tells the user why the app is requesting access to the userβs photo library. |
| NSPhotoLibraryAddUsageDescription | A message that tells the user why the app is requesting add-only access to the userβs photo library. |