CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-expo-media-library

Provides access to user's media library for React Native and Expo applications.

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

permissions.mddocs/

Permission Management

Comprehensive permission system for managing media library access with support for iOS limited access, Android 13+ granular permissions, and system permission picker integration.

Capabilities

Check Availability

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>;

Get Current Permissions

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']
);

Request Permissions

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
);

Permission Hook

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>;
}

Present System Permission Picker

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']);
}

Types

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>;
}

Permission Status Values

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.)

Platform-Specific Behavior

iOS

  • Supports limited access where users can select specific photos
  • accessPrivileges indicates 'all', 'limited', or 'none'
  • Permission picker allows users to modify their selection
  • Requires NSPhotoLibraryUsageDescription and NSPhotoLibraryAddUsageDescription in Info.plist

Android

  • Android 13+ supports granular permissions for audio, photo, and video separately
  • Android 14+ supports permission picker similar to iOS
  • Requires appropriate storage permissions in AndroidManifest.xml
  • Scoped storage handling for Android R+

Web

  • Limited functionality compared to native platforms
  • Browser-based file access through standard web APIs

docs

albums.md

assets.md

events.md

index.md

permissions.md

tile.json