or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

albums.mdassets.mdevents.mdindex.mdpermissions.md
tile.json

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