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.