Zygote
Studyintermediate

Permissions cheat sheet

All 43 dangerous permissions with the API level each was introduced at, generated from the official reference.

7 minAPI 1–37 · 17interactivequizverified 2026-10-27

The dangerous permissions are the ones that show a dialog. There are 43 of them, and knowing which API level each arrived at tells you what you need to guard.

TL;DR#

  • Dangerous permissions need the user's consent. Everything else is granted at install.
  • The list has grown mostly in two waves: runtime permissions in Android 6.0, and granular media and nearby-devices permissions in Android 12 and 13.
  • READ_EXTERNAL_STORAGE still exists but does nothing for media on Android 13+.

Mental model#

A permission is a capability, and the protection level says who can be trusted with it without asking. normal is trusted, dangerous is not, signature is only for apps signed with the definer's key.

Where the analogy breaks#

The protection level is not the whole story. AppOps can block an operation even when the permission is granted, and the permission group determines which dialog the user sees, not what is granted.

The big picture#

Loading diagram…
Text description of this diagram

A treemap of the software on an Android phone. The permissions sheet maps onto the app and framework layers: permissions are declared by apps and enforced by framework services, which is why the list of dangerous permissions reflects what the framework mediates access to.

Deep dive#

PermissionAdded at APIDeprecated at API
ACCESS_COARSE_LOCATION1—
ACCESS_FINE_LOCATION1—
CALL_PHONE1—
CAMERA1—
GET_ACCOUNTS1—
PROCESS_OUTGOING_CALLS1—
READ_CALENDAR1—
READ_CONTACTS1—
READ_PHONE_STATE1—
READ_SMS1—
RECEIVE_MMS1—
RECEIVE_SMS1—
RECEIVE_WAP_PUSH1—
RECORD_AUDIO1—
SEND_SMS1—
WRITE_CALENDAR1—
WRITE_CONTACTS1—
WRITE_EXTERNAL_STORAGE4—
USE_SIP9—
ADD_VOICEMAIL14—
READ_CALL_LOG16—
READ_EXTERNAL_STORAGE16—
WRITE_CALL_LOG16—
BODY_SENSORS20—
ANSWER_PHONE_CALLS26—
READ_PHONE_NUMBERS26—
ACCEPT_HANDOVER28—
ACCESS_BACKGROUND_LOCATION29—
ACCESS_MEDIA_LOCATION29—
ACTIVITY_RECOGNITION29—
BLUETOOTH_ADVERTISE31—
BLUETOOTH_CONNECT31—
BLUETOOTH_SCAN31—
UWB_RANGING31—
BODY_SENSORS_BACKGROUND33—
NEARBY_WIFI_DEVICES33—
POST_NOTIFICATIONS33—
READ_MEDIA_AUDIO33—
READ_MEDIA_IMAGES33—
READ_MEDIA_VIDEO33—
READ_MEDIA_VISUAL_USER_SELECTED34—
RANGING36—
ACCESS_LOCAL_NETWORK37—

How it evolved#

2008–2015Install timeAll or nothing, shown once at install.API 1
2015 →RuntimeAsk in context, deny individually.API 23
2020 →One-timeGrants can expire.API 30
2021 →GranularSplit media, split nearby devices, approximate location.API 31
2026 →SessionPickers replace broad permissions for contacts and local network.API 37

Curiosity corner#

  • ACCESS_BACKGROUND_LOCATION cannot be requested in the same dialog as foreground location, by design. The platform forces a second, deliberate step.

Try it#

See what an app has

adb shell dumpsys package com.example | grep -A40 "runtime permissions" adb shell appops get com.example

Check yourself#

Check yourself

1 / 12

What does an API level identify?

0 answered · 0 correct

Sources#

Sources

Every version number, API level, class name and date on this page is traced to one of these. Pages are re-verified against them; last_verified above says when.

  1. docsManifest.permission | API referencedeveloper.android.comaccessed 2026-10-27↩
  2. docsPermissions on Android | Privacydeveloper.android.comaccessed 2026-10-27↩