Skip to main content
Android permissions control access to sensitive user data and system features. They’re declared in AndroidManifest.xml and can be configured using config plugins.

What are Android permissions?

Android uses a permission system to protect user privacy and security. Apps must declare permissions they need in the manifest, and users grant them at install time (for normal permissions) or runtime (for dangerous permissions).

Permission types

Normal permissions - Granted automatically at install:
  • Internet access
  • Vibration
  • Set alarm
  • Access network state
Dangerous permissions - Require user approval at runtime:
  • Camera
  • Microphone
  • Location
  • Contacts
  • Storage
  • Phone
  • SMS
  • Calendar

Adding permissions with plugins

Basic permission addition

Use withPermissions or modify the manifest directly:

Using AndroidConfig helpers

The recommended approach uses AndroidConfig utilities:
Permissions.ts

Manual manifest modification

Permissions.ts

Permission shorthand

Permissions can be specified with or without the full package:
Permissions.ts

Common permissions

Camera

Location

Microphone

Storage

Contacts

Phone

Calendar

Notifications (Android 13+)

Blocking permissions

Prevent third-party libraries from adding unwanted permissions:
Permissions.ts
From the source:
Permissions.ts

Runtime permissions

Some permissions require runtime requests. While the manifest declares them, your JavaScript code must request them:
Or use Expo’s permissions API:

Permission features and hardware

Adding features

Declare hardware features your app uses:
Common features:
  • android.hardware.camera - Camera
  • android.hardware.camera.autofocus - Camera autofocus
  • android.hardware.location - Location
  • android.hardware.location.gps - GPS
  • android.hardware.microphone - Microphone
  • android.hardware.telephony - Phone
  • android.hardware.touchscreen - Touchscreen
  • android.hardware.bluetooth - Bluetooth
  • android.hardware.nfc - NFC

Max SDK version for permissions

Limit permissions to specific Android versions:

Using Expo config for permissions

Expo’s android.permissions field automatically adds permissions:
app.json
This uses the withPermissions plugin internally:
Permissions.ts

Blocking permissions from config

app.json
From the source:
Permissions.ts

Helper functions from source

Checking if permission exists

Permissions.ts

Adding permission to manifest

Permissions.ts

Getting all permissions

Permissions.ts

Removing permissions

Permissions.ts

Complete example plugin

Testing permission plugins

Best practices

1. Request minimum necessary permissions

Only request permissions your app actually needs.

2. Use permission helpers

Leverage AndroidConfig.Permissions utilities instead of manual manipulation.

3. Block unnecessary permissions

Use blockedPermissions to remove permissions added by third-party libraries.

4. Consider Android version differences

Some permissions changed in Android 11, 12, and 13. Use maxSdkVersion when appropriate.

5. Combine with runtime permission requests

Manifest permissions are necessary but not sufficient. Always request dangerous permissions at runtime.

Next steps