Provides access to user's media library for React Native and Expo applications.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
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