PermissionsAndroid en React Native: Manejo de Permisos en Android

  ¿Qué es PermissionsAndroid y para qué se usa?

PermissionsAndroid es una API que permite solicitar permisos en dispositivos Android, como acceso a la cámara, ubicación, almacenamiento, entre otros. Esta API facilita la solicitud de permisos a los usuarios y también permite verificar si estos permisos ya han sido concedidos antes de realizar ciertas operaciones (por ejemplo, acceder a la cámara o la ubicación).

Se utiliza para pedir permisos de manera programática en dispositivos Android, y es esencial cuando tu aplicación necesita acceder a funciones específicas del dispositivo que requieren autorización del usuario.

🚀 Estructura básica de PermissionsAndroid

PermissionsAndroid es un módulo que proporciona métodos para solicitar, verificar y rechazar permisos en dispositivos Android. Para usarlo, es necesario hacer uso de los siguientes métodos:

  1. check: Verifica si un permiso está concedido.
  2. request: Solicita un permiso.
  3. requestMultiple: Solicita múltiples permisos al mismo tiempo.
  4. shouldShowRequestPermissionRationale: Verifica si se debe mostrar una explicación al usuario antes de solicitar un permiso.
jsx
import React from 'react';
import { Button, PermissionsAndroid, View, Text, StyleSheet } from 'react-native';

const App = () => {
const requestPermission = async () => {
  try {
    // Verificar si el permiso ya está concedido
    const granted = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.CAMERA);
    if (granted) {
      console.log('El permiso para la cámara ya ha sido concedido');
      return;
    }

    // Solicitar el permiso si no ha sido concedido
    const result = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.CAMERA,
      {
        title: 'Permiso para la cámara',
        message: 'Esta aplicación necesita acceso a la cámara',
        buttonNegative: 'Cancelar',
        buttonPositive: 'Aceptar',
      }
    );

    if (result === PermissionsAndroid.RESULTS.GRANTED) {
      console.log('Permiso para la cámara concedido');
    } else {
      console.log('Permiso para la cámara denegado');
    }
  } catch (err) {
    console.warn(err);
  }
};

return (
  <View style={styles.container}>
    <Button title="Solicitar Permiso para Cámara" onPress={requestPermission} />
  </View>
);
};

const styles = StyleSheet.create({
container: {
  flex: 1,
  justifyContent: 'center',
  alignItems: 'center',
},
});

export default App;

🔁 Propiedades y Métodos Comunes de PermissionsAndroid

  • PermissionsAndroid.PERMISSIONS: Contiene las constantes para los permisos más comunes como CAMERA, LOCATION, READ_EXTERNAL_STORAGE, entre otros.
  • request(permission, rationale): Solicita un permiso específico. El objeto rationale puede proporcionar un mensaje personalizado para explicar el motivo de la solicitud.
  • check(permission): Verifica si un permiso está concedido o no. Devuelve una promesa que se resuelve con PermissionsAndroid.RESULTS.GRANTED o PermissionsAndroid.RESULTS.DENIED.
  • shouldShowRequestPermissionRationale(permission): Verifica si es necesario mostrar una justificación antes de solicitar el permiso. Esto es útil para explicar por qué se necesita el permiso antes de que el usuario lo acepte.

🚀 Ejemplo Básico: Solicitar Permiso de Cámara

En este ejemplo, vamos a solicitar permiso para acceder a la cámara del dispositivo.

jsx
import React from 'react';
import { Button, PermissionsAndroid, View, Text } from 'react-native';

const App = () => {
const requestCameraPermission = async () => {
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.CAMERA,
      {
        title: 'Permiso para la cámara',
        message: 'Esta aplicación necesita acceso a la cámara',
        buttonNegative: 'Cancelar',
        buttonPositive: 'Aceptar',
      }
    );
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      console.log('Permiso de cámara concedido');
    } else {
      console.log('Permiso de cámara denegado');
    }
  } catch (err) {
    console.warn(err);
  }
};

return (
  <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
    <Button title="Solicitar Permiso de Cámara" onPress={requestCameraPermission} />
  </View>
);
};

export default App;

🔁 Solicitar Múltiples Permisos

requestMultiple permite solicitar varios permisos de forma simultánea.

jsx
const requestMultiplePermissions = async () => {
try {
  const permissions = await PermissionsAndroid.requestMultiple([
    PermissionsAndroid.PERMISSIONS.CAMERA,
    PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
  ]);
  if (
    permissions[PermissionsAndroid.PERMISSIONS.CAMERA] ===
    PermissionsAndroid.RESULTS.GRANTED
  ) {
    console.log('Permiso de cámara concedido');
  }
  if (
    permissions[PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION] ===
    PermissionsAndroid.RESULTS.GRANTED
  ) {
    console.log('Permiso de ubicación concedido');
  }
} catch (err) {
  console.warn(err);
}
};

🚫 Justificación para Solicitar Permisos

Si el usuario ha rechazado el permiso previamente, es una buena práctica mostrar una justificación antes de volver a solicitar el permiso.

jsx
const showJustification = async () => {
const shouldShow = await PermissionsAndroid.shouldShowRequestPermissionRationale(
  PermissionsAndroid.PERMISSIONS.CAMERA
);
if (shouldShow) {
  // Mostrar una explicación sobre por qué se necesita el permiso
  console.log('Se debe mostrar una justificación para la cámara');
} else {
  console.log('No es necesario mostrar justificación');
}
};
  Resumen

PermissionsAndroid en React Native permite solicitar y gestionar permisos en dispositivos Android. Puedes solicitar permisos específicos, verificar su estado, y proporcionar una justificación antes de solicitar ciertos permisos. Es una herramienta crucial para trabajar con funcionalidades como cámara, ubicación, y almacenamiento en dispositivos Android.