Skip to main content
PermissionsAndroid is Android-only. On other platforms, it returns false for checks and 'denied' for requests.
The PermissionsAndroid API provides access to Android’s runtime permissions model introduced in Android M (API level 23). Use it to request “dangerous” permissions that require explicit user approval.

Import

import { PermissionsAndroid } from 'react-native';

Methods

check()

static check(permission: Permission): Promise<boolean>
Returns a promise resolving to a boolean indicating whether the specified permission has been granted. Parameters:
  • permission: The permission to check (e.g., PermissionsAndroid.PERMISSIONS.CAMERA)

Example

import { PermissionsAndroid } from 'react-native';

const granted = await PermissionsAndroid.check(
  PermissionsAndroid.PERMISSIONS.CAMERA
);

if (granted) {
  console.log('Camera permission granted');
} else {
  console.log('Camera permission denied');
}

request()

static request(
  permission: Permission,
  rationale?: Rationale
): Promise<PermissionStatus>
Prompts the user to enable a permission and returns a promise resolving to the user’s response. Parameters:
  • permission: The permission to request
  • rationale (optional): An object with title, message, and optional button labels
Returns: A promise resolving to:
  • 'granted': Permission granted
  • 'denied': Permission denied
  • 'never_ask_again': User selected “Don’t ask again”

Example

import { PermissionsAndroid } from 'react-native';

const granted = await PermissionsAndroid.request(
  PermissionsAndroid.PERMISSIONS.CAMERA,
  {
    title: 'Camera Permission',
    message: 'App needs access to your camera to take photos.',
    buttonNeutral: 'Ask Me Later',
    buttonNegative: 'Cancel',
    buttonPositive: 'OK',
  }
);

if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  console.log('You can use the camera');
} else {
  console.log('Camera permission denied');
}

requestMultiple()

static requestMultiple(
  permissions: Array<Permission>
): Promise<{ [key: Permission]: PermissionStatus }>
Prompts the user to enable multiple permissions in the same dialog. Parameters:
  • permissions: Array of permissions to request
Returns: A promise resolving to an object mapping each permission to its status.

Example

import { PermissionsAndroid } from 'react-native';

const granted = await PermissionsAndroid.requestMultiple([
  PermissionsAndroid.PERMISSIONS.CAMERA,
  PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
]);

if (
  granted['android.permission.CAMERA'] === PermissionsAndroid.RESULTS.GRANTED &&
  granted['android.permission.RECORD_AUDIO'] === PermissionsAndroid.RESULTS.GRANTED
) {
  console.log('All permissions granted');
} else {
  console.log('Some permissions denied');
}

Constants

PERMISSIONS

A map of available permission strings:
PermissionsAndroid.PERMISSIONS.READ_CALENDAR
PermissionsAndroid.PERMISSIONS.WRITE_CALENDAR
PermissionsAndroid.PERMISSIONS.CAMERA
PermissionsAndroid.PERMISSIONS.READ_CONTACTS
PermissionsAndroid.PERMISSIONS.WRITE_CONTACTS
PermissionsAndroid.PERMISSIONS.GET_ACCOUNTS
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION
PermissionsAndroid.PERMISSIONS.ACCESS_BACKGROUND_LOCATION
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO
PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE
PermissionsAndroid.PERMISSIONS.CALL_PHONE
PermissionsAndroid.PERMISSIONS.READ_CALL_LOG
PermissionsAndroid.PERMISSIONS.WRITE_CALL_LOG
PermissionsAndroid.PERMISSIONS.ADD_VOICEMAIL
PermissionsAndroid.PERMISSIONS.USE_SIP
PermissionsAndroid.PERMISSIONS.PROCESS_OUTGOING_CALLS
PermissionsAndroid.PERMISSIONS.BODY_SENSORS
PermissionsAndroid.PERMISSIONS.BODY_SENSORS_BACKGROUND
PermissionsAndroid.PERMISSIONS.SEND_SMS
PermissionsAndroid.PERMISSIONS.RECEIVE_SMS
PermissionsAndroid.PERMISSIONS.READ_SMS
PermissionsAndroid.PERMISSIONS.RECEIVE_WAP_PUSH
PermissionsAndroid.PERMISSIONS.RECEIVE_MMS
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE
PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES
PermissionsAndroid.PERMISSIONS.READ_MEDIA_VIDEO
PermissionsAndroid.PERMISSIONS.READ_MEDIA_AUDIO
PermissionsAndroid.PERMISSIONS.READ_MEDIA_VISUAL_USER_SELECTED
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT
PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN
PermissionsAndroid.PERMISSIONS.BLUETOOTH_ADVERTISE
PermissionsAndroid.PERMISSIONS.ACCESS_MEDIA_LOCATION
PermissionsAndroid.PERMISSIONS.ACCEPT_HANDOVER
PermissionsAndroid.PERMISSIONS.ACTIVITY_RECOGNITION
PermissionsAndroid.PERMISSIONS.ANSWER_PHONE_CALLS
PermissionsAndroid.PERMISSIONS.READ_PHONE_NUMBERS
PermissionsAndroid.PERMISSIONS.UWB_RANGING
PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS
PermissionsAndroid.PERMISSIONS.NEARBY_WIFI_DEVICES

RESULTS

Permission result values:
PermissionsAndroid.RESULTS.GRANTED           // 'granted'
PermissionsAndroid.RESULTS.DENIED            // 'denied'
PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN   // 'never_ask_again'

Types

Rationale

interface Rationale {
  title: string;
  message: string;
  buttonPositive?: string;
  buttonNegative?: string;
  buttonNeutral?: string;
}

PermissionStatus

type PermissionStatus = 'granted' | 'denied' | 'never_ask_again';

Complete Example

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

function App() {
  const [cameraPermission, setCameraPermission] = useState(null);

  const requestCameraPermission = async () => {
    if (Platform.OS !== 'android') {
      return;
    }

    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.CAMERA,
        {
          title: 'Camera Permission Required',
          message: 'This app needs camera access to take pictures.',
          buttonNeutral: 'Ask Me Later',
          buttonNegative: 'Cancel',
          buttonPositive: 'OK',
        }
      );
      
      setCameraPermission(granted);
      
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        console.log('Camera permission granted');
      } else if (granted === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) {
        console.log('Camera permission denied permanently');
      } else {
        console.log('Camera permission denied');
      }
    } catch (err) {
      console.warn(err);
    }
  };

  return (
    <View>
      <Button title="Request Camera Permission" onPress={requestCameraPermission} />
      <Text>Permission Status: {cameraPermission || 'Not requested'}</Text>
    </View>
  );
}

export default App;

Notes

  • Permissions must also be declared in AndroidManifest.xml.
  • Some permissions are automatically granted if declared in the manifest (“normal” permissions).
  • Only “dangerous” permissions require runtime requests.
  • Users can revoke permissions at any time through system settings.
  • Handle the 'never_ask_again' status by directing users to app settings.

Build docs developers (and LLMs) love