Comprehensive permission system for managing media library access with support for iOS limited access, Android 13+ granular permissions, and system permission picker integration.
Determines if the Media Library API is available on the current device.
/**
* Checks if Media Library API is available on current device
* @returns Promise resolving to boolean indicating availability
*/
function isAvailableAsync(): Promise<boolean>;Checks the current permission status without requesting new permissions.
/**
* Checks current permissions for media library access
* @param writeOnly - Request write-only access (optional)
* @param granularPermissions - Array of specific permission types for Android 13+ (optional)
* @returns Promise resolving to PermissionResponse with access details
*/
function getPermissionsAsync(
writeOnly?: boolean,
granularPermissions?: GranularPermission[]
): Promise<PermissionResponse>;Usage Examples:
import * as MediaLibrary from "expo-media-library";
// Check basic permissions
const permissions = await MediaLibrary.getPermissionsAsync();
console.log('Status:', permissions.status);
console.log('Access privileges:', permissions.accessPrivileges);
// Check write-only permissions
const writePermissions = await MediaLibrary.getPermissionsAsync(true);
// Check granular permissions (Android 13+)
const granularPermissions = await MediaLibrary.getPermissionsAsync(
false,
['photo', 'video']
);Requests permission to access the media library with optional granular control.
/**
* Requests user permission to access media library
* @param writeOnly - Request write-only access (optional)
* @param granularPermissions - Array of specific permission types for Android 13+ (optional)
* @returns Promise resolving to PermissionResponse with granted access details
*/
function requestPermissionsAsync(
writeOnly?: boolean,
granularPermissions?: GranularPermission[]
): Promise<PermissionResponse>;Usage Examples:
import * as MediaLibrary from "expo-media-library";
// Request full permissions
const { status, accessPrivileges } = await MediaLibrary.requestPermissionsAsync();
if (status === 'granted') {
console.log('Permission granted with access:', accessPrivileges);
}
// Request write-only permissions
const writePermission = await MediaLibrary.requestPermissionsAsync(true);
// Request specific media types (Android 13+)
const specificPermissions = await MediaLibrary.requestPermissionsAsync(
false,
['photo', 'video'] // Only request photo and video access
);React hook for managing permissions with automatic state management.
/**
* React hook for permission management
* @param options - Permission hook configuration options
* @returns Tuple of [permission status, request function, get function]
*/
function usePermissions(
options?: PermissionHookOptions<object>
): [
PermissionResponse | null,
() => Promise<PermissionResponse>,
() => Promise<PermissionResponse>
];Usage Examples:
import React from 'react';
import * as MediaLibrary from "expo-media-library";
function MediaComponent() {
const [permission, requestPermission, getPermission] = MediaLibrary.usePermissions();
React.useEffect(() => {
if (permission?.status === 'undetermined') {
requestPermission();
}
}, [permission?.status, requestPermission]);
if (!permission?.granted) {
return <Text>Permission not granted</Text>;
}
return <Text>Permission granted with access: {permission.accessPrivileges}</Text>;
}Shows the system modal for updating app's media access permissions (iOS and Android 14+).
/**
* Shows system modal to update app's media access (iOS/Android 14+)
* @param mediaTypes - Array of media types to request access for (optional)
* @returns Promise resolving when picker is dismissed
* @platform ios, android 14+
*/
function presentPermissionsPickerAsync(
mediaTypes?: MediaTypeFilter[]
): Promise<void>;Usage Examples:
import * as MediaLibrary from "expo-media-library";
// Present picker for all media types
await MediaLibrary.presentPermissionsPickerAsync();
// Present picker for specific media types
await MediaLibrary.presentPermissionsPickerAsync(['photo', 'video']);
// Use with permission checking
const permission = await MediaLibrary.getPermissionsAsync();
if (permission.accessPrivileges === 'limited') {
// User has limited access, show picker to potentially get more access
await MediaLibrary.presentPermissionsPickerAsync(['photo']);
}interface PermissionResponse extends EXPermissionResponse {
/**
* Indicates app's access level to the photo library:
* - 'all': Access to the whole photo library
* - 'limited': Access only to selected photos (iOS 14+, Android 14+)
* - 'none': No access or permission denied
*/
accessPrivileges?: 'all' | 'limited' | 'none';
}
/**
* Granular permission types for Android 13+
* @platform android 13+
*/
type GranularPermission = 'audio' | 'photo' | 'video';
/**
* Media type filters for permission picker
* @platform android 14+, ios
*/
type MediaTypeFilter = 'photo' | 'video';
interface PermissionHookOptions<T> {
/**
* Custom request function for specialized permission handling
*/
request?: () => Promise<PermissionResponse>;
/**
* Custom get function for specialized permission checking
*/
get?: () => Promise<PermissionResponse>;
}The permission status follows the standard Expo permission system:
'undetermined': Permission hasn't been requested yet'granted': Permission has been granted'denied': Permission has been permanently denied'restricted': Permission is restricted (parental controls, etc.)accessPrivileges indicates 'all', 'limited', or 'none'NSPhotoLibraryUsageDescription and NSPhotoLibraryAddUsageDescription in Info.plist