Photo Library Permission — conceptos básicos, tipos de acceso y principio de funcionamiento

Autor: IT Sectr Publicado: 2026-05-21 Tiempo de lectura: 8 min

Photo Library Permission es un permiso necesario para que una aplicación acceda a las fotos y videos almacenados en el dispositivo del usuario. Se requiere para seleccionar imágenes de la galería, guardar archivos multimedia y administrar álbumes de fotos. Según Apple Developer Documentation, 2024, a partir de iOS 14 las aplicaciones deben solicitar acceso a una biblioteca limitada, no a todas las fotos a la vez.

Puntos Clave

  • Photo Library Permission — permiso para leer y escribir archivos multimedia en la galería del dispositivo, obligatorio para trabajar con fotos y videos.
  • Android utiliza READ_MEDIA_IMAGES, READ_MEDIA_VIDEO (Android 13+) o READ_EXTERNAL_STORAGE para acceder a la galería.
  • iOS utiliza PHPhotoLibrary con acceso limitado (Limited Photo Library Access) a partir de iOS 14.
  • Seleccionar fotos individuales mediante el selector del sistema (PhotoPicker) no requiere permiso para acceder a toda la biblioteca.
  • Escribir en la galería requiere un permiso de escritura independiente (WRITE_EXTERNAL_STORAGE en Android, PHPhotoLibrary en iOS).

Conceptos Básicos de Photo Library Permission

Photo Library Permission es un permiso del sistema que regula el acceso de una aplicación a los archivos multimedia almacenados en el dispositivo. Abarca tanto la lectura (ver y seleccionar fotos y videos) como la escritura (guardar nuevos archivos en la galería). Las plataformas móviles consideran la biblioteca multimedia como datos sensibles porque las fotos pueden contener información personal y privada.

En Android 13 (API 33), Google dividió el permiso único READ_EXTERNAL_STORAGE en tres separados: READ_MEDIA_IMAGES para fotos, READ_MEDIA_VIDEO para videos y READ_MEDIA_AUDIO para audio. Esto permite a los usuarios conceder acceso solo a un tipo específico de archivo multimedia. En iOS, a partir de iOS 14, PhotoKit permite a los usuarios seleccionar fotos específicas para el acceso en lugar de abrir toda la biblioteca.

Según Counterpoint Research (2024), más del 70% de las aplicaciones móviles en las categorías de redes sociales, comunicación y editores de fotos solicitan Photo Library Permission. Al mismo tiempo, el 32% de los usuarios deniega el acceso a la galería si no entienden por qué la aplicación necesita sus fotos. Apple y Google recomiendan usar el PhotoPicker del sistema para seleccionar archivos individuales sin solicitar acceso completo.

Acceso a la Galería en Android

El acceso a la galería en Android ha cambiado significativamente con el lanzamiento de Android 13. En lugar de un solo permiso READ_EXTERNAL_STORAGE, se introdujeron permisos granulares para cada tipo de multimedia, lo que da a los usuarios más control.

Permisos en Android 13+

A partir de Android 13, se utiliza READ_MEDIA_IMAGES para el acceso a fotos y READ_MEDIA_VIDEO para el acceso a videos. El permiso READ_EXTERNAL_STORAGE ya no proporciona acceso a archivos multimedia — se conserva solo para leer archivos no multimedia del almacenamiento compartido. La declaración en el manifiesto se ve así:

xml
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

Compatibilidad con Android 12 y Versiones Anteriores

Para la compatibilidad con versiones anteriores de Android 12 y anteriores, también es necesario declarar READ_EXTERNAL_STORAGE. Sin embargo, Android 13 ignora automáticamente este permiso cuando están presentes los nuevos granulares. Use el atributo android:maxSdkVersion="32" en el manifiesto para el permiso antiguo y ocultarlo en versiones más nuevas. Esto evita solicitudes redundantes en dispositivos con Android 13+.

xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />

Solicitud en Tiempo de Ejecución en Kotlin

La solicitud en tiempo de ejecución para Photo Library Permission en Android se realiza mediante Activity Result API. Ejemplo para solicitar acceso a imágenes:

kotlin
private val photoPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
    if (granted) {
        loadGalleryImages()
    } else {
        showPermissionDenied()
    }
}

fun pickPhoto() {
    val permission = if (Build.version.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        Manifest.permission.READ_MEDIA_IMAGES
    } else {
        Manifest.permission.READ_EXTERNAL_STORAGE
    }
    if (ContextCompat.checkSelfPermission(this, permission)
        == PackageManager.PERMISSION_GRANTED) {
        loadGalleryImages()
    } else {
        photoPermissionLauncher.launch(permission)
    }
}

Acceso a la Galería en iOS

El acceso a la galería en iOS se gestiona a través del framework PhotoKit y las claves NSPhotoLibraryUsageDescription y NSPhotoLibraryAddUsageDescription en Info.plist. A partir de iOS 14, los usuarios pueden conceder acceso solo a fotos seleccionadas (Limited Photo Library).

Configuración de Info.plist

La lectura de fotos de la biblioteca requiere NSPhotoLibraryUsageDescription, mientras que la escritura (guardar fotos) requiere NSPhotoLibraryAddUsageDescription. Si la aplicación solo guarda multimedia pero no lo lee, la segunda clave es suficiente.

xml
<key>NSPhotoLibraryUsageDescription</key>
<string>La aplicación necesita acceso a las fotos para seleccionar una imagen de perfil y publicar instantáneas.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>La aplicación necesita acceso para guardar fotos procesadas en tu galería.</string>

Solicitud en Swift

La solicitud de acceso a fotos en iOS se realiza mediante PHPhotoLibrary.requestAuthorization. A partir de iOS 14, el estado .limited indica que el usuario ha concedido acceso a un conjunto limitado de fotos.

swift
import PhotosUI

func requestPhotoLibraryAccess() {
    PHPhotoLibrary.requestAuthorization { status in
        DispatchQueue.main.async {
            switch status {
            case .authorized:
                self.loadPhotoLibrary()
            case .limited:
                self.loadSelectedPhotos()
            case .denied, .restricted:
                self.showSettingsAlert()
            case .notDetermined:
                break
            }
        }
    }
}

private func loadPhotoLibrary() {
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    let assets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
    // Manejo de los resultados de la solicitud
}

Manejo de Acceso Limitado

El estado .limited en iOS 14+ significa que el usuario ha concedido acceso solo a unas pocas fotos seleccionadas. La aplicación puede solicitar acceso ampliado a través de un diálogo del sistema llamando a PHPhotoLibrary.shared().presentLimitedLibraryPicker. Se recomienda mostrar este diálogo solo cuando el usuario solicita explícitamente una función que requiere fotos adicionales.

PhotoPicker vs Permiso del Sistema

PhotoPicker es un componente del sistema para seleccionar archivos multimedia que no requiere permiso para acceder a toda la biblioteca. A partir de Android 13 y iOS 14, Google y Apple recomiendan usar PhotoPicker en lugar de solicitar Photo Library Permission si la aplicación solo necesita seleccionar una o varias fotos.

PhotoPicker en Android

En Android 13+, el PhotoPicker integrado (ActivityResultContracts.PickVisualMedia) permite a los usuarios seleccionar una foto o video sin conceder acceso a toda la galería. La aplicación recibe solo el URI de los archivos seleccionados. PhotoPicker funciona sin declarar ningún permiso en el manifiesto.

kotlin
private val pickMedia =
    registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
    if (uri != null) {
        // URI del archivo seleccionado, sin acceso a toda la biblioteca
        showImage(uri)
    }
}

fun selectPhoto() {
    pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}

PHPicker en iOS

En iOS 14+ se introdujo PHPickerViewController — un selector del sistema que tampoco requiere acceso a toda la biblioteca. PHPicker se ejecuta en un proceso separado y no tiene acceso a la biblioteca de la aplicación. Esta es la forma preferida de seleccionar fotos para la mayoría de los escenarios.

swift
import PhotosUI

func presentPhotoPicker() {
    var config = PHPickerConfiguration()
    config.selectionLimit = 1
    config.filter = .images

    let picker = PHPickerViewController(configuration: config)
    picker.delegate = self
    present(picker, animated: true)
}

Cuándo se Necesita Permiso Completo

PhotoPicker no es adecuado si la aplicación necesita acceso a toda la biblioteca para operaciones masivas: copia de seguridad, sincronización en la nube, aplicación de galería, administrador de archivos. En estos casos, es necesario solicitar Photo Library Permission y manejar el caso de acceso limitado (Limited). Para iOS, es obligatorio incluir el manejo del estado .limited y ofrecer a los usuarios la opción de ampliar el acceso.

Mejores Prácticas de Acceso a la Galería

Las mejores prácticas para trabajar con Photo Library Permission ayudan a reducir la cantidad de denegaciones y cumplir con los requisitos de privacidad de las plataformas.

Use PhotoPicker por Defecto

Para seleccionar una o varias fotos, use el PhotoPicker o PHPicker del sistema. Estos componentes no requieren permisos y brindan la mejor experiencia de usuario. Solicite acceso completo a la galería solo si la funcionalidad de la aplicación requiere acceso a toda la biblioteca multimedia. Google y Apple recomiendan explícitamente este enfoque en su documentación para desarrolladores.

Explique la Razón del Acceso Completo

Si la aplicación realmente necesita acceso completo a la galería, muestre una pantalla preliminar con una explicación. Explique por qué se necesitan todas las fotos y no solo una. Por ejemplo, una aplicación de respaldo debe explicar que escaneará todos los archivos multimedia para crear una copia. La pantalla de pre-permiso es especialmente importante para iOS debido al mecanismo de Acceso Limitado.

Solicite Solo los Permisos Necesarios

Si la aplicación solo guarda fotos pero no las lee (por ejemplo, un editor de fotos que guarda el resultado), solicite solo el permiso de escritura en la galería. En Android, esto es WRITE_EXTERNAL_STORAGE (para Android 12 y versiones anteriores) o la API MediaStore sin permisos (para Android 10+). En iOS, use NSPhotoLibraryAddUsageDescription sin NSPhotoLibraryUsageDescription.

Preguntas Frecuentes

¿Se necesita permiso para guardar fotos en Android 10+?

A partir de Android 10 (API 29), guardar fotos a través de MediaStore no requiere el permiso WRITE_EXTERNAL_STORAGE. El sistema proporciona acceso al almacenamiento compartido para escritura sin un permiso explícito. Leer los archivos de otros usuarios aún requiere el permiso correspondiente.

¿En qué se diferencia READ_EXTERNAL_STORAGE de READ_MEDIA_IMAGES?

READ_EXTERNAL_STORAGE es el permiso antiguo para leer todos los archivos del almacenamiento compartido (hasta Android 12). READ_MEDIA_IMAGES es un nuevo permiso granular para leer solo imágenes (Android 13+). Los usuarios pueden conceder acceso solo a las fotos, denegando el acceso a videos y audio.

¿Cómo manejar el estado .limited en iOS?

El estado .limited significa que el usuario seleccionó algunas fotos para el acceso. La aplicación puede mostrar un diálogo de extensión del sistema mediante PHPhotoLibrary.shared().presentLimitedLibraryPicker. Se recomienda mostrar este diálogo solo cuando el usuario lo solicite explícitamente, por ejemplo, al tocar un botón “Agregar más fotos”.

¿Se pueden leer los metadatos EXIF de las fotos?

Sí, con Photo Library Permission, la aplicación puede leer datos EXIF, incluyendo geotags, fecha de captura y modelo de cámara. En iOS, acceder a los geotags puede requerir un permiso de ubicación adicional, ya que Apple considera las coordenadas GPS como datos confidenciales.

¿Cómo seleccionar un video de la galería sin permiso?

Use el selector del sistema: PHPicker con filter = .videos en iOS, PickVisualMedia con VideoOnly en Android. En Android, también puede usar Intent(Intent.ACTION_PICK) con MediaStore.Video.Media.EXTERNAL_CONTENT_URI para seleccionar un video de la galería, pero esto requiere el permiso READ_EXTERNAL_STORAGE en versiones anteriores a Android 13.

Resumen

  • Photo Library Permission — permiso para leer y escribir archivos multimedia, obligatorio para aplicaciones que trabajan con la galería del dispositivo.
  • Android 13+ utiliza permisos granulares READ_MEDIA_IMAGES y READ_MEDIA_VIDEO en lugar del único READ_EXTERNAL_STORAGE.
  • iOS 14+ permite a los usuarios conceder acceso solo a fotos seleccionadas (Limited) a través de PhotoKit.
  • PhotoPicker es la forma recomendada de seleccionar archivos individuales sin solicitar acceso completo a la biblioteca.
  • Escribir en la galería en Android 10+ no requiere permiso a través de MediaStore, en iOS requiere NSPhotoLibraryAddUsageDescription.
  • Pantalla de pre-permiso que explica el propósito de la recopilación de fotos aumenta la conversión de aprobación y reduce las denegaciones.
  • Acceso Limitado en iOS requiere manejo adicional y la posibilidad de solicitar acceso ampliado a través de un diálogo del sistema.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también