Skip to content

Instantly share code, notes, and snippets.

@byCedric
Last active August 18, 2022 06:42
Show Gist options
  • Save byCedric/8cc3372608962708a022b5dcc6231569 to your computer and use it in GitHub Desktop.
Save byCedric/8cc3372608962708a022b5dcc6231569 to your computer and use it in GitHub Desktop.
Android and iOS permission scraper

Native Permission scrapers

These two scripts scrapes Android's permissions and iOS usage description lists. It extracts key information and stores it in JSON to use within other documentation.

How to use

  • Set up the files locally
  • Run $ yarn install
  • Run $ node scrape-android.js or $ node scrape-ios.js
{
"ACCEPT_HANDOVER": {
"apiAdded": 28,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCEPT_HANDOVER",
"description": "Allows a calling app to continue a call which was started in another app.",
"descriptionLong": "An example is a video calling app that wants to continue a voice call on the user's mobile network.",
"constant": "android.permission.ACCEPT_HANDOVER",
"protection": "dangerous",
"warning": null
},
"ACCESS_BACKGROUND_LOCATION": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_BACKGROUND_LOCATION",
"description": "Allows an app to access location in the background.",
"descriptionLong": "If you're requesting this permission, you must also request either <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#ACCESS_COARSE_LOCATION\">ACCESS_COARSE_LOCATION</a></code> or <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION\">ACCESS_FINE_LOCATION</a></code>. Requesting this permission by itself doesn't give you location access.",
"constant": "android.permission.ACCESS_BACKGROUND_LOCATION",
"protection": "dangerous",
"warning": null
},
"ACCESS_BLOBS_ACROSS_USERS": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_BLOBS_ACROSS_USERS",
"description": "Allows an application to access data blobs across users.",
"descriptionLong": null,
"constant": "android.permission.ACCESS_BLOBS_ACROSS_USERS",
"protection": null,
"warning": null
},
"ACCESS_CHECKIN_PROPERTIES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_CHECKIN_PROPERTIES",
"description": "Allows read/write access to the \"properties\" table in the checkin database, to change values that get uploaded.",
"descriptionLong": null,
"constant": "android.permission.ACCESS_CHECKIN_PROPERTIES",
"protection": null,
"warning": null
},
"ACCESS_COARSE_LOCATION": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_COARSE_LOCATION",
"description": "Allows an app to access approximate location.",
"descriptionLong": "Alternatively, you might want <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION\">ACCESS_FINE_LOCATION</a></code>.",
"constant": "android.permission.ACCESS_COARSE_LOCATION",
"protection": "dangerous",
"warning": null
},
"ACCESS_FINE_LOCATION": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_FINE_LOCATION",
"description": "Allows an app to access precise location.",
"descriptionLong": "Alternatively, you might want <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#ACCESS_COARSE_LOCATION\">ACCESS_COARSE_LOCATION</a></code>.",
"constant": "android.permission.ACCESS_FINE_LOCATION",
"protection": "dangerous",
"warning": null
},
"ACCESS_LOCATION_EXTRA_COMMANDS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_LOCATION_EXTRA_COMMANDS",
"description": "Allows an application to access extra location provider commands.",
"descriptionLong": null,
"constant": "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS",
"protection": "normal",
"warning": null
},
"ACCESS_MEDIA_LOCATION": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_MEDIA_LOCATION",
"description": "Allows an application to access any geographic locations persisted in the user's shared collection.",
"descriptionLong": null,
"constant": "android.permission.ACCESS_MEDIA_LOCATION",
"protection": "dangerous",
"warning": null
},
"ACCESS_NETWORK_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_NETWORK_STATE",
"description": "Allows applications to access information about networks.",
"descriptionLong": null,
"constant": "android.permission.ACCESS_NETWORK_STATE",
"protection": "normal",
"warning": null
},
"ACCESS_NOTIFICATION_POLICY": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_NOTIFICATION_POLICY",
"description": "Marker permission for applications that wish to access notification policy.",
"descriptionLong": "This permission is not supported on managed profiles.",
"constant": "android.permission.ACCESS_NOTIFICATION_POLICY",
"protection": "normal",
"warning": null
},
"ACCESS_WIFI_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCESS_WIFI_STATE",
"description": "Allows applications to access information about Wi-Fi networks.",
"descriptionLong": null,
"constant": "android.permission.ACCESS_WIFI_STATE",
"protection": "normal",
"warning": null
},
"ACCOUNT_MANAGER": {
"apiAdded": 5,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACCOUNT_MANAGER",
"description": "Allows applications to call into AccountAuthenticators.",
"descriptionLong": null,
"constant": "android.permission.ACCOUNT_MANAGER",
"protection": null,
"warning": null
},
"ACTIVITY_RECOGNITION": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ACTIVITY_RECOGNITION",
"description": "Allows an application to recognize physical activity.",
"descriptionLong": null,
"constant": "android.permission.ACTIVITY_RECOGNITION",
"protection": "dangerous",
"warning": null
},
"ADD_VOICEMAIL": {
"apiAdded": 14,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ADD_VOICEMAIL",
"description": "Allows an application to add voicemails into the system.",
"descriptionLong": null,
"constant": "com.android.voicemail.permission.ADD_VOICEMAIL",
"protection": "dangerous",
"warning": null
},
"ANSWER_PHONE_CALLS": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "ANSWER_PHONE_CALLS",
"description": "Allows the app to answer an incoming phone call.",
"descriptionLong": null,
"constant": "android.permission.ANSWER_PHONE_CALLS",
"protection": "dangerous",
"warning": null
},
"BATTERY_STATS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BATTERY_STATS",
"description": "Allows an application to collect battery statistics",
"descriptionLong": null,
"constant": "android.permission.BATTERY_STATS",
"protection": "signature|privileged|development",
"warning": null
},
"BIND_ACCESSIBILITY_SERVICE": {
"apiAdded": 16,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_ACCESSIBILITY_SERVICE",
"description": "Must be required by an AccessibilityService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by an <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/accessibilityservice/AccessibilityService\">AccessibilityService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_ACCESSIBILITY_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_APPWIDGET": {
"apiAdded": 3,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_APPWIDGET",
"description": "Allows an application to tell the AppWidget service which application can access AppWidget's data.",
"descriptionLong": "The normal user flow is that a user picks an AppWidget to go into a particular host, thereby giving that host application access to the private data from the AppWidget app. An application that has this permission should honor that contract.",
"constant": "android.permission.BIND_APPWIDGET",
"protection": null,
"warning": null
},
"BIND_AUTOFILL_SERVICE": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_AUTOFILL_SERVICE",
"description": "Must be required by a AutofillService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/autofill/AutofillService\">AutofillService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_AUTOFILL_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_CALL_REDIRECTION_SERVICE": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_CALL_REDIRECTION_SERVICE",
"description": "Must be required by a CallRedirectionService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/CallRedirectionService\">CallRedirectionService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_CALL_REDIRECTION_SERVICE",
"protection": "signature|privileged",
"warning": null
},
"BIND_CARRIER_MESSAGING_CLIENT_SERVICE": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_CARRIER_MESSAGING_CLIENT_SERVICE",
"description": "A subclass of CarrierMessagingClientService must be protected with this permission.",
"descriptionLong": "A subclass of <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/carrier/CarrierMessagingClientService\">CarrierMessagingClientService</a></code> must be protected with this permission.",
"constant": "android.permission.BIND_CARRIER_MESSAGING_CLIENT_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_CARRIER_MESSAGING_SERVICE": {
"apiAdded": 22,
"apiDeprecated": 23,
"apiReplaced": "BIND_CARRIER_SERVICES",
"name": "BIND_CARRIER_MESSAGING_SERVICE",
"description": "",
"descriptionLong": null,
"constant": "android.permission.BIND_CARRIER_MESSAGING_SERVICE",
"protection": null,
"warning": "This constant was deprecated in API level 23. Use BIND_CARRIER_SERVICES instead"
},
"BIND_CARRIER_SERVICES": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_CARRIER_SERVICES",
"description": "The system process that is allowed to bind to services in carrier apps will have this permission.",
"descriptionLong": "Carrier apps should use this permission to protect their services that only the system is allowed to bind to.",
"constant": "android.permission.BIND_CARRIER_SERVICES",
"protection": "signature|privileged",
"warning": null
},
"BIND_CHOOSER_TARGET_SERVICE": {
"apiAdded": 23,
"apiDeprecated": 30,
"apiReplaced": null,
"name": "BIND_CHOOSER_TARGET_SERVICE",
"description": "",
"descriptionLong": null,
"constant": "android.permission.BIND_CHOOSER_TARGET_SERVICE",
"protection": "signature",
"warning": "This constant was deprecated in API level 30. For publishing direct share targets, please follow the instructions in https://developer.android.com/training/sharing/receive.html#providing-direct-share-targets instead."
},
"BIND_COMPANION_DEVICE_SERVICE": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_COMPANION_DEVICE_SERVICE",
"description": "Must be required by any CompanionDeviceServices to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by any <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/companion/CompanionDeviceService\">CompanionDeviceService</a></code>s to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_COMPANION_DEVICE_SERVICE",
"protection": null,
"warning": null
},
"BIND_CONDITION_PROVIDER_SERVICE": {
"apiAdded": 24,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_CONDITION_PROVIDER_SERVICE",
"description": "Must be required by a ConditionProviderService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/notification/ConditionProviderService\">ConditionProviderService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_CONDITION_PROVIDER_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_CONTROLS": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_CONTROLS",
"description": "Allows SystemUI to request third party controls.",
"descriptionLong": null,
"constant": "android.permission.BIND_CONTROLS",
"protection": null,
"warning": null
},
"BIND_DEVICE_ADMIN": {
"apiAdded": 8,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_DEVICE_ADMIN",
"description": "Must be required by device administration receiver, to ensure that only the system can interact with it.",
"descriptionLong": null,
"constant": "android.permission.BIND_DEVICE_ADMIN",
"protection": "signature",
"warning": null
},
"BIND_DREAM_SERVICE": {
"apiAdded": 21,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_DREAM_SERVICE",
"description": "Must be required by an DreamService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by an <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/dreams/DreamService\">DreamService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_DREAM_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_INCALL_SERVICE": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_INCALL_SERVICE",
"description": "Must be required by a InCallService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/InCallService\">InCallService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_INCALL_SERVICE",
"protection": "signature|privileged",
"warning": null
},
"BIND_INPUT_METHOD": {
"apiAdded": 3,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_INPUT_METHOD",
"description": "Must be required by an InputMethodService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by an <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/inputmethodservice/InputMethodService\">InputMethodService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_INPUT_METHOD",
"protection": "signature",
"warning": null
},
"BIND_MIDI_DEVICE_SERVICE": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_MIDI_DEVICE_SERVICE",
"description": "Must be required by an MidiDeviceService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by an <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/media/midi/MidiDeviceService\">MidiDeviceService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_MIDI_DEVICE_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_NFC_SERVICE": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_NFC_SERVICE",
"description": "Must be required by a HostApduService or OffHostApduService to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/nfc/cardemulation/HostApduService\">HostApduService</a></code> or <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/nfc/cardemulation/OffHostApduService\">OffHostApduService</a></code> to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_NFC_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_NOTIFICATION_LISTENER_SERVICE": {
"apiAdded": 18,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_NOTIFICATION_LISTENER_SERVICE",
"description": "Must be required by an NotificationListenerService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by an <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/notification/NotificationListenerService\">NotificationListenerService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_PRINT_SERVICE": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_PRINT_SERVICE",
"description": "Must be required by a PrintService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/printservice/PrintService\">PrintService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_PRINT_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_QUICK_ACCESS_WALLET_SERVICE": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_QUICK_ACCESS_WALLET_SERVICE",
"description": "Must be required by a QuickAccessWalletService to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/quickaccesswallet/QuickAccessWalletService\">QuickAccessWalletService</a></code> to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_QUICK_ACCESS_WALLET_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_QUICK_SETTINGS_TILE": {
"apiAdded": 24,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_QUICK_SETTINGS_TILE",
"description": "Allows an application to bind to third party quick settings tiles.",
"descriptionLong": null,
"constant": "android.permission.BIND_QUICK_SETTINGS_TILE",
"protection": null,
"warning": null
},
"BIND_REMOTEVIEWS": {
"apiAdded": 11,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_REMOTEVIEWS",
"description": "Must be required by a RemoteViewsService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/widget/RemoteViewsService\">RemoteViewsService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_REMOTEVIEWS",
"protection": "signature|privileged",
"warning": null
},
"BIND_SCREENING_SERVICE": {
"apiAdded": 24,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_SCREENING_SERVICE",
"description": "Must be required by a CallScreeningService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/CallScreeningService\">CallScreeningService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_SCREENING_SERVICE",
"protection": "signature|privileged",
"warning": null
},
"BIND_TELECOM_CONNECTION_SERVICE": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_TELECOM_CONNECTION_SERVICE",
"description": "Must be required by a ConnectionService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/ConnectionService\">ConnectionService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_TELECOM_CONNECTION_SERVICE",
"protection": "signature|privileged",
"warning": null
},
"BIND_TEXT_SERVICE": {
"apiAdded": 14,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_TEXT_SERVICE",
"description": "Must be required by a TextService (e.g.",
"descriptionLong": "&nbsp;SpellCheckerService) to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_TEXT_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_TV_INPUT": {
"apiAdded": 21,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_TV_INPUT",
"description": "Must be required by a TvInputService to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/media/tv/TvInputService\">TvInputService</a></code> to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_TV_INPUT",
"protection": "signature|privileged",
"warning": null
},
"BIND_VISUAL_VOICEMAIL_SERVICE": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_VISUAL_VOICEMAIL_SERVICE",
"description": "Must be required by a link VisualVoicemailService to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a link <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telephony/VisualVoicemailService\">VisualVoicemailService</a></code> to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_VISUAL_VOICEMAIL_SERVICE",
"protection": "signature|privileged",
"warning": null
},
"BIND_VOICE_INTERACTION": {
"apiAdded": 21,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_VOICE_INTERACTION",
"description": "Must be required by a VoiceInteractionService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/voice/VoiceInteractionService\">VoiceInteractionService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_VOICE_INTERACTION",
"protection": "signature",
"warning": null
},
"BIND_VPN_SERVICE": {
"apiAdded": 14,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_VPN_SERVICE",
"description": "Must be required by a VpnService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/net/VpnService\">VpnService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_VPN_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_VR_LISTENER_SERVICE": {
"apiAdded": 24,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_VR_LISTENER_SERVICE",
"description": "Must be required by an VrListenerService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by an <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/vr/VrListenerService\">VrListenerService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_VR_LISTENER_SERVICE",
"protection": "signature",
"warning": null
},
"BIND_WALLPAPER": {
"apiAdded": 8,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BIND_WALLPAPER",
"description": "Must be required by a WallpaperService, to ensure that only the system can bind to it.",
"descriptionLong": "Must be required by a <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/service/wallpaper/WallpaperService\">WallpaperService</a></code>, to ensure that only the system can bind to it.",
"constant": "android.permission.BIND_WALLPAPER",
"protection": "signature|privileged",
"warning": null
},
"BLUETOOTH": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BLUETOOTH",
"description": "Allows applications to connect to paired bluetooth devices.",
"descriptionLong": null,
"constant": "android.permission.BLUETOOTH",
"protection": "normal",
"warning": null
},
"BLUETOOTH_ADMIN": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BLUETOOTH_ADMIN",
"description": "Allows applications to discover and pair bluetooth devices.",
"descriptionLong": null,
"constant": "android.permission.BLUETOOTH_ADMIN",
"protection": "normal",
"warning": null
},
"BLUETOOTH_ADVERTISE": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BLUETOOTH_ADVERTISE",
"description": "Required to be able to advertise to nearby Bluetooth devices.",
"descriptionLong": null,
"constant": "android.permission.BLUETOOTH_ADVERTISE",
"protection": "dangerous",
"warning": null
},
"BLUETOOTH_CONNECT": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BLUETOOTH_CONNECT",
"description": "Required to be able to connect to paired Bluetooth devices.",
"descriptionLong": null,
"constant": "android.permission.BLUETOOTH_CONNECT",
"protection": "dangerous",
"warning": null
},
"BLUETOOTH_PRIVILEGED": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BLUETOOTH_PRIVILEGED",
"description": "Allows applications to pair bluetooth devices without user interaction, and to allow or disallow phonebook access or message access.",
"descriptionLong": null,
"constant": "android.permission.BLUETOOTH_PRIVILEGED",
"protection": null,
"warning": null
},
"BLUETOOTH_SCAN": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BLUETOOTH_SCAN",
"description": "Required to be able to discover and pair nearby Bluetooth devices.",
"descriptionLong": null,
"constant": "android.permission.BLUETOOTH_SCAN",
"protection": "dangerous",
"warning": null
},
"BODY_SENSORS": {
"apiAdded": 20,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BODY_SENSORS",
"description": "Allows an application to access data from sensors that the user uses to measure what is happening inside their body, such as heart rate.",
"descriptionLong": null,
"constant": "android.permission.BODY_SENSORS",
"protection": "dangerous",
"warning": null
},
"BROADCAST_PACKAGE_REMOVED": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BROADCAST_PACKAGE_REMOVED",
"description": "Allows an application to broadcast a notification that an application package has been removed.",
"descriptionLong": null,
"constant": "android.permission.BROADCAST_PACKAGE_REMOVED",
"protection": null,
"warning": null
},
"BROADCAST_SMS": {
"apiAdded": 2,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BROADCAST_SMS",
"description": "Allows an application to broadcast an SMS receipt notification.",
"descriptionLong": null,
"constant": "android.permission.BROADCAST_SMS",
"protection": null,
"warning": null
},
"BROADCAST_STICKY": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BROADCAST_STICKY",
"description": "Allows an application to broadcast sticky intents.",
"descriptionLong": "These are broadcasts whose data is held by the system after being finished, so that clients can quickly retrieve that data without having to wait for the next broadcast.",
"constant": "android.permission.BROADCAST_STICKY",
"protection": "normal",
"warning": null
},
"BROADCAST_WAP_PUSH": {
"apiAdded": 2,
"apiDeprecated": null,
"apiReplaced": null,
"name": "BROADCAST_WAP_PUSH",
"description": "Allows an application to broadcast a WAP PUSH receipt notification.",
"descriptionLong": null,
"constant": "android.permission.BROADCAST_WAP_PUSH",
"protection": null,
"warning": null
},
"CALL_COMPANION_APP": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CALL_COMPANION_APP",
"description": "Allows an app which implements the InCallService API to be eligible to be enabled as a calling companion app.",
"descriptionLong": "Allows an app which implements the <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/InCallService\">InCallService</a></code> API to be eligible to be enabled as a calling companion app. This means that the Telecom framework will bind to the app's InCallService implementation when there are calls active. The app can use the InCallService API to view information about calls on the system and control these calls.",
"constant": "android.permission.CALL_COMPANION_APP",
"protection": "normal",
"warning": null
},
"CALL_PHONE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CALL_PHONE",
"description": "Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call.",
"descriptionLong": null,
"constant": "android.permission.CALL_PHONE",
"protection": "dangerous",
"warning": null
},
"CALL_PRIVILEGED": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CALL_PRIVILEGED",
"description": "Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed.",
"descriptionLong": null,
"constant": "android.permission.CALL_PRIVILEGED",
"protection": null,
"warning": null
},
"CAMERA": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CAMERA",
"description": "Required to be able to access the camera device.",
"descriptionLong": null,
"constant": "android.permission.CAMERA",
"protection": "dangerous",
"warning": null
},
"CAPTURE_AUDIO_OUTPUT": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CAPTURE_AUDIO_OUTPUT",
"description": "Allows an application to capture audio output.",
"descriptionLong": "Use the <code translate=\"no\" dir=\"ltr\">CAPTURE_MEDIA_OUTPUT</code> permission if only the <code translate=\"no\" dir=\"ltr\">USAGE_UNKNOWN</code>), <code translate=\"no\" dir=\"ltr\">USAGE_MEDIA</code>) or <code translate=\"no\" dir=\"ltr\">USAGE_GAME</code>) usages are intended to be captured.",
"constant": "android.permission.CAPTURE_AUDIO_OUTPUT",
"protection": null,
"warning": null
},
"CHANGE_COMPONENT_ENABLED_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CHANGE_COMPONENT_ENABLED_STATE",
"description": "Allows an application to change whether an application component (other than its own) is enabled or not.",
"descriptionLong": null,
"constant": "android.permission.CHANGE_COMPONENT_ENABLED_STATE",
"protection": null,
"warning": null
},
"CHANGE_CONFIGURATION": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CHANGE_CONFIGURATION",
"description": "Allows an application to modify the current configuration, such as locale.",
"descriptionLong": null,
"constant": "android.permission.CHANGE_CONFIGURATION",
"protection": "signature|privileged|development",
"warning": null
},
"CHANGE_NETWORK_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CHANGE_NETWORK_STATE",
"description": "Allows applications to change network connectivity state.",
"descriptionLong": null,
"constant": "android.permission.CHANGE_NETWORK_STATE",
"protection": "normal",
"warning": null
},
"CHANGE_WIFI_MULTICAST_STATE": {
"apiAdded": 4,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CHANGE_WIFI_MULTICAST_STATE",
"description": "Allows applications to enter Wi-Fi Multicast mode.",
"descriptionLong": null,
"constant": "android.permission.CHANGE_WIFI_MULTICAST_STATE",
"protection": "normal",
"warning": null
},
"CHANGE_WIFI_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CHANGE_WIFI_STATE",
"description": "Allows applications to change Wi-Fi connectivity state.",
"descriptionLong": null,
"constant": "android.permission.CHANGE_WIFI_STATE",
"protection": "normal",
"warning": null
},
"CLEAR_APP_CACHE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CLEAR_APP_CACHE",
"description": "Allows an application to clear the caches of all installed applications on the device.",
"descriptionLong": null,
"constant": "android.permission.CLEAR_APP_CACHE",
"protection": "signature|privileged",
"warning": null
},
"CONTROL_LOCATION_UPDATES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "CONTROL_LOCATION_UPDATES",
"description": "Allows enabling/disabling location update notifications from the radio.",
"descriptionLong": null,
"constant": "android.permission.CONTROL_LOCATION_UPDATES",
"protection": null,
"warning": null
},
"DELETE_CACHE_FILES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "DELETE_CACHE_FILES",
"description": "Old permission for deleting an app's cache files, no longer used, but signals for us to quietly ignore calls instead of throwing an exception.",
"descriptionLong": null,
"constant": "android.permission.DELETE_CACHE_FILES",
"protection": "signature|privileged",
"warning": null
},
"DELETE_PACKAGES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "DELETE_PACKAGES",
"description": "Allows an application to delete packages.",
"descriptionLong": null,
"constant": "android.permission.DELETE_PACKAGES",
"protection": null,
"warning": null
},
"DIAGNOSTIC": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "DIAGNOSTIC",
"description": "Allows applications to RW to diagnostic resources.",
"descriptionLong": null,
"constant": "android.permission.DIAGNOSTIC",
"protection": null,
"warning": null
},
"DISABLE_KEYGUARD": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "DISABLE_KEYGUARD",
"description": "Allows applications to disable the keyguard if it is not secure.",
"descriptionLong": null,
"constant": "android.permission.DISABLE_KEYGUARD",
"protection": "normal",
"warning": null
},
"DUMP": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "DUMP",
"description": "Allows an application to retrieve state dump information from system services.",
"descriptionLong": null,
"constant": "android.permission.DUMP",
"protection": null,
"warning": null
},
"EXPAND_STATUS_BAR": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "EXPAND_STATUS_BAR",
"description": "Allows an application to expand or collapse the status bar.",
"descriptionLong": null,
"constant": "android.permission.EXPAND_STATUS_BAR",
"protection": "normal",
"warning": null
},
"FACTORY_TEST": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "FACTORY_TEST",
"description": "Run as a manufacturer test application, running as the root user.",
"descriptionLong": "Only available when the device is running in manufacturer test mode.",
"constant": "android.permission.FACTORY_TEST",
"protection": null,
"warning": null
},
"FOREGROUND_SERVICE": {
"apiAdded": 28,
"apiDeprecated": null,
"apiReplaced": null,
"name": "FOREGROUND_SERVICE",
"description": "Allows a regular application to use Service.startForeground.",
"descriptionLong": "Allows a regular application to use <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/app/Service#startForeground(int,%20android.app.Notification)\">Service.startForeground</a></code>.",
"constant": "android.permission.FOREGROUND_SERVICE",
"protection": "normal",
"warning": null
},
"GET_ACCOUNTS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "GET_ACCOUNTS",
"description": "Allows access to the list of accounts in the Accounts Service.",
"descriptionLong": null,
"constant": "android.permission.GET_ACCOUNTS",
"protection": "dangerous",
"warning": null
},
"GET_ACCOUNTS_PRIVILEGED": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "GET_ACCOUNTS_PRIVILEGED",
"description": "Allows access to the list of accounts in the Accounts Service.",
"descriptionLong": null,
"constant": "android.permission.GET_ACCOUNTS_PRIVILEGED",
"protection": "signature|privileged",
"warning": null
},
"GET_PACKAGE_SIZE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "GET_PACKAGE_SIZE",
"description": "Allows an application to find out the space used by any package.",
"descriptionLong": null,
"constant": "android.permission.GET_PACKAGE_SIZE",
"protection": "normal",
"warning": null
},
"GET_TASKS": {
"apiAdded": 1,
"apiDeprecated": 21,
"apiReplaced": null,
"name": "GET_TASKS",
"description": "",
"descriptionLong": null,
"constant": "android.permission.GET_TASKS",
"protection": null,
"warning": "This constant was deprecated in API level 21. No longer enforced."
},
"GLOBAL_SEARCH": {
"apiAdded": 4,
"apiDeprecated": null,
"apiReplaced": null,
"name": "GLOBAL_SEARCH",
"description": "This permission can be used on content providers to allow the global search system to access their data.",
"descriptionLong": "Typically it used when the provider has some permissions protecting it (which global search would not be expected to hold), and added as a read-only permission to the path in the provider where global search queries are performed. This permission can not be held by regular applications; it is used by applications to protect themselves from everyone else besides global search.",
"constant": "android.permission.GLOBAL_SEARCH",
"protection": "signature|privileged",
"warning": null
},
"HIDE_OVERLAY_WINDOWS": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "HIDE_OVERLAY_WINDOWS",
"description": "Allows an app to prevent non-system-overlay windows from being drawn on top of it",
"descriptionLong": null,
"constant": "android.permission.HIDE_OVERLAY_WINDOWS",
"protection": null,
"warning": null
},
"HIGH_SAMPLING_RATE_SENSORS": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "HIGH_SAMPLING_RATE_SENSORS",
"description": "Allows an app to access sensor data with a sampling rate greater than 200 Hz.",
"descriptionLong": null,
"constant": "android.permission.HIGH_SAMPLING_RATE_SENSORS",
"protection": "normal",
"warning": null
},
"INSTALL_LOCATION_PROVIDER": {
"apiAdded": 4,
"apiDeprecated": null,
"apiReplaced": null,
"name": "INSTALL_LOCATION_PROVIDER",
"description": "Allows an application to install a location provider into the Location Manager.",
"descriptionLong": null,
"constant": "android.permission.INSTALL_LOCATION_PROVIDER",
"protection": null,
"warning": null
},
"INSTALL_PACKAGES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "INSTALL_PACKAGES",
"description": "Allows an application to install packages.",
"descriptionLong": null,
"constant": "android.permission.INSTALL_PACKAGES",
"protection": null,
"warning": null
},
"INSTALL_SHORTCUT": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "INSTALL_SHORTCUT",
"description": "Allows an application to install a shortcut in Launcher.",
"descriptionLong": null,
"constant": "com.android.launcher.permission.INSTALL_SHORTCUT",
"protection": "normal",
"warning": null
},
"INSTANT_APP_FOREGROUND_SERVICE": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "INSTANT_APP_FOREGROUND_SERVICE",
"description": "Allows an instant app to create foreground services.",
"descriptionLong": null,
"constant": "android.permission.INSTANT_APP_FOREGROUND_SERVICE",
"protection": "signature|development|instant|appop",
"warning": null
},
"INTERACT_ACROSS_PROFILES": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "INTERACT_ACROSS_PROFILES",
"description": "Allows interaction across profiles in the same profile group.",
"descriptionLong": null,
"constant": "android.permission.INTERACT_ACROSS_PROFILES",
"protection": null,
"warning": null
},
"INTERNET": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "INTERNET",
"description": "Allows applications to open network sockets.",
"descriptionLong": null,
"constant": "android.permission.INTERNET",
"protection": "normal",
"warning": null
},
"KILL_BACKGROUND_PROCESSES": {
"apiAdded": 8,
"apiDeprecated": null,
"apiReplaced": null,
"name": "KILL_BACKGROUND_PROCESSES",
"description": "Allows an application to call ActivityManager.killBackgroundProcesses(String).",
"descriptionLong": "Allows an application to call <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/app/ActivityManager#killBackgroundProcesses(java.lang.String)\">ActivityManager.killBackgroundProcesses(String)</a></code>.",
"constant": "android.permission.KILL_BACKGROUND_PROCESSES",
"protection": "normal",
"warning": null
},
"LOADER_USAGE_STATS": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "LOADER_USAGE_STATS",
"description": "Allows a data loader to read a package's access logs.",
"descriptionLong": "The access logs contain the set of pages referenced over time.",
"constant": "android.permission.LOADER_USAGE_STATS",
"protection": "signature|privileged|appop",
"warning": null
},
"LOCATION_HARDWARE": {
"apiAdded": 18,
"apiDeprecated": null,
"apiReplaced": null,
"name": "LOCATION_HARDWARE",
"description": "Allows an application to use location features in hardware, such as the geofencing api.",
"descriptionLong": null,
"constant": "android.permission.LOCATION_HARDWARE",
"protection": null,
"warning": null
},
"MANAGE_DOCUMENTS": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MANAGE_DOCUMENTS",
"description": "Allows an application to manage access to documents, usually as part of a document picker.",
"descriptionLong": null,
"constant": "android.permission.MANAGE_DOCUMENTS",
"protection": null,
"warning": null
},
"MANAGE_EXTERNAL_STORAGE": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MANAGE_EXTERNAL_STORAGE",
"description": "Allows an application a broad access to external storage in scoped storage.",
"descriptionLong": "Intended to be used by few apps that need to manage files on behalf of the users.",
"constant": "android.permission.MANAGE_EXTERNAL_STORAGE",
"protection": "signature|appop|preinstalled",
"warning": null
},
"MANAGE_MEDIA": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MANAGE_MEDIA",
"description": "Allows an application to modify and delete media files on this device or any connected storage device without user confirmation.",
"descriptionLong": "Applications must already be granted the <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE\">READ_EXTERNAL_STORAGE</a></code> or <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#MANAGE_EXTERNAL_STORAGE\">MANAGE_EXTERNAL_STORAGE</a></code>} permissions for this permission to take effect.",
"constant": "android.permission.MANAGE_MEDIA",
"protection": "signature|appop|preinstalled",
"warning": null
},
"MANAGE_ONGOING_CALLS": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MANAGE_ONGOING_CALLS",
"description": "Allows to query ongoing call details and manage ongoing calls",
"descriptionLong": null,
"constant": "android.permission.MANAGE_ONGOING_CALLS",
"protection": "signature|appop",
"warning": null
},
"MANAGE_OWN_CALLS": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MANAGE_OWN_CALLS",
"description": "Allows a calling application which manages its own calls through the self-managed ConnectionService APIs.",
"descriptionLong": "Allows a calling application which manages its own calls through the self-managed <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/ConnectionService\">ConnectionService</a></code> APIs. See <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/PhoneAccount#CAPABILITY_SELF_MANAGED\">PhoneAccount.CAPABILITY_SELF_MANAGED</a></code> for more information on the self-managed ConnectionService APIs.",
"constant": "android.permission.MANAGE_OWN_CALLS",
"protection": "normal",
"warning": null
},
"MASTER_CLEAR": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MASTER_CLEAR",
"description": "Not for use by third-party applications.",
"descriptionLong": null,
"constant": "android.permission.MASTER_CLEAR",
"protection": null,
"warning": null
},
"MEDIA_CONTENT_CONTROL": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MEDIA_CONTENT_CONTROL",
"description": "Allows an application to know what content is playing and control its playback.",
"descriptionLong": null,
"constant": "android.permission.MEDIA_CONTENT_CONTROL",
"protection": null,
"warning": null
},
"MODIFY_AUDIO_SETTINGS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MODIFY_AUDIO_SETTINGS",
"description": "Allows an application to modify global audio settings.",
"descriptionLong": null,
"constant": "android.permission.MODIFY_AUDIO_SETTINGS",
"protection": "normal",
"warning": null
},
"MODIFY_PHONE_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MODIFY_PHONE_STATE",
"description": "Allows modification of the telephony state - power on, mmi, etc.",
"descriptionLong": "Does not include placing calls.",
"constant": "android.permission.MODIFY_PHONE_STATE",
"protection": null,
"warning": null
},
"MOUNT_FORMAT_FILESYSTEMS": {
"apiAdded": 3,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MOUNT_FORMAT_FILESYSTEMS",
"description": "Allows formatting file systems for removable storage.",
"descriptionLong": null,
"constant": "android.permission.MOUNT_FORMAT_FILESYSTEMS",
"protection": null,
"warning": null
},
"MOUNT_UNMOUNT_FILESYSTEMS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "MOUNT_UNMOUNT_FILESYSTEMS",
"description": "Allows mounting and unmounting file systems for removable storage.",
"descriptionLong": null,
"constant": "android.permission.MOUNT_UNMOUNT_FILESYSTEMS",
"protection": null,
"warning": null
},
"NFC": {
"apiAdded": 9,
"apiDeprecated": null,
"apiReplaced": null,
"name": "NFC",
"description": "Allows applications to perform I/O operations over NFC.",
"descriptionLong": null,
"constant": "android.permission.NFC",
"protection": "normal",
"warning": null
},
"NFC_PREFERRED_PAYMENT_INFO": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "NFC_PREFERRED_PAYMENT_INFO",
"description": "Allows applications to receive NFC preferred payment service information.",
"descriptionLong": null,
"constant": "android.permission.NFC_PREFERRED_PAYMENT_INFO",
"protection": "normal",
"warning": null
},
"NFC_TRANSACTION_EVENT": {
"apiAdded": 28,
"apiDeprecated": null,
"apiReplaced": null,
"name": "NFC_TRANSACTION_EVENT",
"description": "Allows applications to receive NFC transaction events.",
"descriptionLong": null,
"constant": "android.permission.NFC_TRANSACTION_EVENT",
"protection": "normal",
"warning": null
},
"PACKAGE_USAGE_STATS": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "PACKAGE_USAGE_STATS",
"description": "Allows an application to collect component usage statistics",
"descriptionLong": null,
"constant": "android.permission.PACKAGE_USAGE_STATS",
"protection": "signature|privileged|development|appop|retailDemo",
"warning": null
},
"PERSISTENT_ACTIVITY": {
"apiAdded": 1,
"apiDeprecated": 15,
"apiReplaced": null,
"name": "PERSISTENT_ACTIVITY",
"description": "",
"descriptionLong": null,
"constant": "android.permission.PERSISTENT_ACTIVITY",
"protection": null,
"warning": "This constant was deprecated in API level 15. This functionality will be removed in the future; please do not use. Allow an application to make its activities persistent."
},
"PROCESS_OUTGOING_CALLS": {
"apiAdded": 1,
"apiDeprecated": 29,
"apiReplaced": "CallRedirectionServiceIntent.ACTION_NEW_OUTGOING_CALL",
"name": "PROCESS_OUTGOING_CALLS",
"description": "",
"descriptionLong": null,
"constant": "android.permission.PROCESS_OUTGOING_CALLS",
"protection": "dangerous",
"warning": "This constant was deprecated in API level 29. Applications should use CallRedirectionService instead of the Intent.ACTION_NEW_OUTGOING_CALL broadcast."
},
"QUERY_ALL_PACKAGES": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "QUERY_ALL_PACKAGES",
"description": "Allows query of any normal app on the device, regardless of manifest declarations.",
"descriptionLong": null,
"constant": "android.permission.QUERY_ALL_PACKAGES",
"protection": "normal",
"warning": null
},
"READ_CALENDAR": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_CALENDAR",
"description": "Allows an application to read the user's calendar data.",
"descriptionLong": null,
"constant": "android.permission.READ_CALENDAR",
"protection": "dangerous",
"warning": null
},
"READ_CALL_LOG": {
"apiAdded": 16,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_CALL_LOG",
"description": "Allows an application to read the user's call log.",
"descriptionLong": null,
"constant": "android.permission.READ_CALL_LOG",
"protection": "dangerous",
"warning": null
},
"READ_CONTACTS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_CONTACTS",
"description": "Allows an application to read the user's contacts data.",
"descriptionLong": null,
"constant": "android.permission.READ_CONTACTS",
"protection": "dangerous",
"warning": null
},
"READ_EXTERNAL_STORAGE": {
"apiAdded": 16,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_EXTERNAL_STORAGE",
"description": "Allows an application to read from external storage.",
"descriptionLong": null,
"constant": "android.permission.READ_EXTERNAL_STORAGE",
"protection": "dangerous",
"warning": null
},
"READ_INPUT_STATE": {
"apiAdded": 1,
"apiDeprecated": 16,
"apiReplaced": null,
"name": "READ_INPUT_STATE",
"description": "",
"descriptionLong": null,
"constant": "android.permission.READ_INPUT_STATE",
"protection": null,
"warning": "This constant was deprecated in API level 16. The API that used this permission has been removed."
},
"READ_LOGS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_LOGS",
"description": "Allows an application to read the low-level system log files.",
"descriptionLong": null,
"constant": "android.permission.READ_LOGS",
"protection": null,
"warning": null
},
"READ_PHONE_NUMBERS": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_PHONE_NUMBERS",
"description": "Allows read access to the device's phone number(s).",
"descriptionLong": "This is a subset of the capabilities granted by <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#READ_PHONE_STATE\">READ_PHONE_STATE</a></code> but is exposed to instant applications.",
"constant": "android.permission.READ_PHONE_NUMBERS",
"protection": "dangerous",
"warning": null
},
"READ_PHONE_STATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_PHONE_STATE",
"description": "Allows read only access to phone state, including the current cellular network information, the status of any ongoing calls, and a list of any PhoneAccounts registered on the device.",
"descriptionLong": "Allows read only access to phone state, including the current cellular network information, the status of any ongoing calls, and a list of any <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/telecom/PhoneAccount\">PhoneAccount</a></code>s registered on the device.",
"constant": "android.permission.READ_PHONE_STATE",
"protection": "dangerous",
"warning": null
},
"READ_PRECISE_PHONE_STATE": {
"apiAdded": 30,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_PRECISE_PHONE_STATE",
"description": "Allows read only access to precise phone state.",
"descriptionLong": "Allows reading of detailed information about phone state for special-use applications such as dialers, carrier applications, or ims applications.",
"constant": "android.permission.READ_PRECISE_PHONE_STATE",
"protection": null,
"warning": null
},
"READ_SMS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_SMS",
"description": "Allows an application to read SMS messages.",
"descriptionLong": null,
"constant": "android.permission.READ_SMS",
"protection": "dangerous",
"warning": null
},
"READ_SYNC_SETTINGS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_SYNC_SETTINGS",
"description": "Allows applications to read the sync settings.",
"descriptionLong": null,
"constant": "android.permission.READ_SYNC_SETTINGS",
"protection": "normal",
"warning": null
},
"READ_SYNC_STATS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_SYNC_STATS",
"description": "Allows applications to read the sync stats.",
"descriptionLong": null,
"constant": "android.permission.READ_SYNC_STATS",
"protection": "normal",
"warning": null
},
"READ_VOICEMAIL": {
"apiAdded": 21,
"apiDeprecated": null,
"apiReplaced": null,
"name": "READ_VOICEMAIL",
"description": "Allows an application to read voicemails in the system.",
"descriptionLong": null,
"constant": "com.android.voicemail.permission.READ_VOICEMAIL",
"protection": "signature|privileged|role",
"warning": null
},
"REBOOT": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REBOOT",
"description": "Required to be able to reboot the device.",
"descriptionLong": null,
"constant": "android.permission.REBOOT",
"protection": null,
"warning": null
},
"RECEIVE_BOOT_COMPLETED": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "RECEIVE_BOOT_COMPLETED",
"description": "Allows an application to receive the Intent.ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting.",
"descriptionLong": "Allows an application to receive the <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/content/Intent#ACTION_BOOT_COMPLETED\">Intent.ACTION_BOOT_COMPLETED</a></code> that is broadcast after the system finishes booting. If you don't request this permission, you will not receive the broadcast at that time. Though holding this permission does not have any security implications, it can have a negative impact on the user experience by increasing the amount of time it takes the system to start and allowing applications to have themselves running without the user being aware of them. As such, you must explicitly declare your use of this facility to make that visible to the user.",
"constant": "android.permission.RECEIVE_BOOT_COMPLETED",
"protection": "normal",
"warning": null
},
"RECEIVE_MMS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "RECEIVE_MMS",
"description": "Allows an application to monitor incoming MMS messages.",
"descriptionLong": null,
"constant": "android.permission.RECEIVE_MMS",
"protection": "dangerous",
"warning": null
},
"RECEIVE_SMS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "RECEIVE_SMS",
"description": "Allows an application to receive SMS messages.",
"descriptionLong": null,
"constant": "android.permission.RECEIVE_SMS",
"protection": "dangerous",
"warning": null
},
"RECEIVE_WAP_PUSH": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "RECEIVE_WAP_PUSH",
"description": "Allows an application to receive WAP push messages.",
"descriptionLong": null,
"constant": "android.permission.RECEIVE_WAP_PUSH",
"protection": "dangerous",
"warning": null
},
"RECORD_AUDIO": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "RECORD_AUDIO",
"description": "Allows an application to record audio.",
"descriptionLong": null,
"constant": "android.permission.RECORD_AUDIO",
"protection": "dangerous",
"warning": null
},
"REORDER_TASKS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REORDER_TASKS",
"description": "Allows an application to change the Z-order of tasks.",
"descriptionLong": null,
"constant": "android.permission.REORDER_TASKS",
"protection": "normal",
"warning": null
},
"REQUEST_COMPANION_PROFILE_WATCH": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_COMPANION_PROFILE_WATCH",
"description": "Allows app to request to be associated with a device via CompanionDeviceManager as a \"watch\"",
"descriptionLong": "Allows app to request to be associated with a device via <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/companion/CompanionDeviceManager\">CompanionDeviceManager</a></code> as a \"watch\"",
"constant": "android.permission.REQUEST_COMPANION_PROFILE_WATCH",
"protection": "normal",
"warning": null
},
"REQUEST_COMPANION_RUN_IN_BACKGROUND": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_COMPANION_RUN_IN_BACKGROUND",
"description": "Allows a companion app to run in the background.",
"descriptionLong": "This permission implies <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND\">REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND</a></code>, and allows to start a foreground service from the background. If an app does not have to run in the background, but only needs to start a foreground service from the background, consider using <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/Manifest.permission#REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND\">REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND</a></code>, which is less powerful.",
"constant": "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND",
"protection": "normal",
"warning": null
},
"REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND",
"description": "Allows a companion app to start a foreground service from the background.",
"descriptionLong": null,
"constant": "android.permission.REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND",
"protection": "normal",
"warning": null
},
"REQUEST_COMPANION_USE_DATA_IN_BACKGROUND": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_COMPANION_USE_DATA_IN_BACKGROUND",
"description": "Allows a companion app to use data in the background.",
"descriptionLong": null,
"constant": "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND",
"protection": "normal",
"warning": null
},
"REQUEST_DELETE_PACKAGES": {
"apiAdded": 26,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_DELETE_PACKAGES",
"description": "Allows an application to request deleting packages.",
"descriptionLong": "Apps targeting APIs <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/os/Build.VERSION_CODES#P\">Build.VERSION_CODES.P</a></code> or greater must hold this permission in order to use <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/content/Intent#ACTION_UNINSTALL_PACKAGE\">Intent.ACTION_UNINSTALL_PACKAGE</a></code> or <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/content/pm/PackageInstaller#uninstall(android.content.pm.VersionedPackage,%20android.content.IntentSender)\">PackageInstaller.uninstall(VersionedPackage, IntentSender)</a></code>.",
"constant": "android.permission.REQUEST_DELETE_PACKAGES",
"protection": "normal",
"warning": null
},
"REQUEST_IGNORE_BATTERY_OPTIMIZATIONS": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_IGNORE_BATTERY_OPTIMIZATIONS",
"description": "Permission an application must hold in order to use Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS.",
"descriptionLong": "Permission an application must hold in order to use <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/provider/Settings#ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\">Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS</a></code>.",
"constant": "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS",
"protection": "normal",
"warning": null
},
"REQUEST_INSTALL_PACKAGES": {
"apiAdded": 23,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_INSTALL_PACKAGES",
"description": "Allows an application to request installing packages.",
"descriptionLong": "Apps targeting APIs greater than 25 must hold this permission in order to use <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/content/Intent#ACTION_INSTALL_PACKAGE\">Intent.ACTION_INSTALL_PACKAGE</a></code>.",
"constant": "android.permission.REQUEST_INSTALL_PACKAGES",
"protection": "signature",
"warning": null
},
"REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE",
"description": "Allows an application to subscribe to notifications about the presence status change of their associated companion device",
"descriptionLong": null,
"constant": "android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE",
"protection": null,
"warning": null
},
"REQUEST_PASSWORD_COMPLEXITY": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "REQUEST_PASSWORD_COMPLEXITY",
"description": "Allows an application to request the screen lock complexity and prompt users to update the screen lock to a certain complexity level.",
"descriptionLong": null,
"constant": "android.permission.REQUEST_PASSWORD_COMPLEXITY",
"protection": "normal",
"warning": null
},
"RESTART_PACKAGES": {
"apiAdded": 1,
"apiDeprecated": 15,
"apiReplaced": "ActivityManager.restartPackage(String)",
"name": "RESTART_PACKAGES",
"description": "",
"descriptionLong": null,
"constant": "android.permission.RESTART_PACKAGES",
"protection": null,
"warning": "This constant was deprecated in API level 15. The ActivityManager.restartPackage(String) API is no longer supported."
},
"SCHEDULE_EXACT_ALARM": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SCHEDULE_EXACT_ALARM",
"description": "Allows applications to use exact alarm APIs.",
"descriptionLong": null,
"constant": "android.permission.SCHEDULE_EXACT_ALARM",
"protection": null,
"warning": null
},
"SEND_RESPOND_VIA_MESSAGE": {
"apiAdded": 18,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SEND_RESPOND_VIA_MESSAGE",
"description": "Allows an application (Phone) to send a request to other applications to handle the respond-via-message action during incoming calls.",
"descriptionLong": null,
"constant": "android.permission.SEND_RESPOND_VIA_MESSAGE",
"protection": null,
"warning": null
},
"SEND_SMS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SEND_SMS",
"description": "Allows an application to send SMS messages.",
"descriptionLong": null,
"constant": "android.permission.SEND_SMS",
"protection": "dangerous",
"warning": null
},
"SET_ALARM": {
"apiAdded": 9,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_ALARM",
"description": "Allows an application to broadcast an Intent to set an alarm for the user.",
"descriptionLong": null,
"constant": "com.android.alarm.permission.SET_ALARM",
"protection": "normal",
"warning": null
},
"SET_ALWAYS_FINISH": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_ALWAYS_FINISH",
"description": "Allows an application to control whether activities are immediately finished when put in the background.",
"descriptionLong": null,
"constant": "android.permission.SET_ALWAYS_FINISH",
"protection": null,
"warning": null
},
"SET_ANIMATION_SCALE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_ANIMATION_SCALE",
"description": "Modify the global animation scaling factor.",
"descriptionLong": null,
"constant": "android.permission.SET_ANIMATION_SCALE",
"protection": null,
"warning": null
},
"SET_DEBUG_APP": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_DEBUG_APP",
"description": "Configure an application for debugging.",
"descriptionLong": null,
"constant": "android.permission.SET_DEBUG_APP",
"protection": null,
"warning": null
},
"SET_PREFERRED_APPLICATIONS": {
"apiAdded": 1,
"apiDeprecated": 15,
"apiReplaced": "PackageManager.addPackageToPreferred(String)",
"name": "SET_PREFERRED_APPLICATIONS",
"description": "",
"descriptionLong": null,
"constant": "android.permission.SET_PREFERRED_APPLICATIONS",
"protection": null,
"warning": "This constant was deprecated in API level 15. No longer useful, see PackageManager.addPackageToPreferred(String) for details."
},
"SET_PROCESS_LIMIT": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_PROCESS_LIMIT",
"description": "Allows an application to set the maximum number of (not needed) application processes that can be running.",
"descriptionLong": null,
"constant": "android.permission.SET_PROCESS_LIMIT",
"protection": null,
"warning": null
},
"SET_TIME": {
"apiAdded": 8,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_TIME",
"description": "Allows applications to set the system time directly.",
"descriptionLong": null,
"constant": "android.permission.SET_TIME",
"protection": null,
"warning": null
},
"SET_TIME_ZONE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_TIME_ZONE",
"description": "Allows applications to set the system time zone directly.",
"descriptionLong": null,
"constant": "android.permission.SET_TIME_ZONE",
"protection": null,
"warning": null
},
"SET_WALLPAPER": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_WALLPAPER",
"description": "Allows applications to set the wallpaper.",
"descriptionLong": null,
"constant": "android.permission.SET_WALLPAPER",
"protection": "normal",
"warning": null
},
"SET_WALLPAPER_HINTS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SET_WALLPAPER_HINTS",
"description": "Allows applications to set the wallpaper hints.",
"descriptionLong": null,
"constant": "android.permission.SET_WALLPAPER_HINTS",
"protection": "normal",
"warning": null
},
"SIGNAL_PERSISTENT_PROCESSES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SIGNAL_PERSISTENT_PROCESSES",
"description": "Allow an application to request that a signal be sent to all persistent processes.",
"descriptionLong": null,
"constant": "android.permission.SIGNAL_PERSISTENT_PROCESSES",
"protection": null,
"warning": null
},
"SMS_FINANCIAL_TRANSACTIONS": {
"apiAdded": 29,
"apiDeprecated": 31,
"apiReplaced": null,
"name": "SMS_FINANCIAL_TRANSACTIONS",
"description": "",
"descriptionLong": null,
"constant": "android.permission.SMS_FINANCIAL_TRANSACTIONS",
"protection": null,
"warning": "This constant was deprecated in API level 31. The API that used this permission is no longer functional."
},
"START_FOREGROUND_SERVICES_FROM_BACKGROUND": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "START_FOREGROUND_SERVICES_FROM_BACKGROUND",
"description": "Allows an application to start foreground services from the background at any time.",
"descriptionLong": "<em>This permission is not for use by third-party applications</em>, with the only exception being if the app is the default SMS app. Otherwise, it's only usable by privileged apps, app verifier app, and apps with any of the EMERGENCY or SYSTEM GALLERY roles.",
"constant": "android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND",
"protection": null,
"warning": null
},
"START_VIEW_PERMISSION_USAGE": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "START_VIEW_PERMISSION_USAGE",
"description": "Allows the holder to start the permission usage screen for an app.",
"descriptionLong": null,
"constant": "android.permission.START_VIEW_PERMISSION_USAGE",
"protection": "signature|installer",
"warning": null
},
"STATUS_BAR": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "STATUS_BAR",
"description": "Allows an application to open, close, or disable the status bar and its icons.",
"descriptionLong": null,
"constant": "android.permission.STATUS_BAR",
"protection": null,
"warning": null
},
"SYSTEM_ALERT_WINDOW": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "SYSTEM_ALERT_WINDOW",
"description": "Allows an app to create windows using the type WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, shown on top of all other apps.",
"descriptionLong": "Allows an app to create windows using the type <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/view/WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY\">WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY</a></code>, shown on top of all other apps. Very few apps should use this permission; these windows are intended for system-level interaction with the user.",
"constant": "android.permission.SYSTEM_ALERT_WINDOW",
"protection": "signature|setup|appop|installer|pre23|development",
"warning": null
},
"TRANSMIT_IR": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "TRANSMIT_IR",
"description": "Allows using the device's IR transmitter, if available.",
"descriptionLong": null,
"constant": "android.permission.TRANSMIT_IR",
"protection": "normal",
"warning": null
},
"UNINSTALL_SHORTCUT": {
"apiAdded": 19,
"apiDeprecated": null,
"apiReplaced": null,
"name": "UNINSTALL_SHORTCUT",
"description": "",
"descriptionLong": null,
"constant": "com.android.launcher.permission.UNINSTALL_SHORTCUT",
"protection": null,
"warning": "Don't use this permission in your app.This permission is no longer supported."
},
"UPDATE_DEVICE_STATS": {
"apiAdded": 3,
"apiDeprecated": null,
"apiReplaced": null,
"name": "UPDATE_DEVICE_STATS",
"description": "Allows an application to update device statistics.",
"descriptionLong": null,
"constant": "android.permission.UPDATE_DEVICE_STATS",
"protection": null,
"warning": null
},
"UPDATE_PACKAGES_WITHOUT_USER_ACTION": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "UPDATE_PACKAGES_WITHOUT_USER_ACTION",
"description": "Allows an application to indicate via PackageInstaller.SessionParams.setRequireUserAction(int) that user action should not be required for an app update.",
"descriptionLong": "Allows an application to indicate via <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)\">PackageInstaller.SessionParams.setRequireUserAction(int)</a></code> that user action should not be required for an app update.",
"constant": "android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION",
"protection": "normal",
"warning": null
},
"USE_BIOMETRIC": {
"apiAdded": 28,
"apiDeprecated": null,
"apiReplaced": null,
"name": "USE_BIOMETRIC",
"description": "Allows an app to use device supported biometric modalities.",
"descriptionLong": null,
"constant": "android.permission.USE_BIOMETRIC",
"protection": "normal",
"warning": null
},
"USE_FINGERPRINT": {
"apiAdded": 23,
"apiDeprecated": 28,
"apiReplaced": "USE_BIOMETRIC",
"name": "USE_FINGERPRINT",
"description": "",
"descriptionLong": null,
"constant": "android.permission.USE_FINGERPRINT",
"protection": "normal",
"warning": "This constant was deprecated in API level 28. Applications should request USE_BIOMETRIC instead"
},
"USE_FULL_SCREEN_INTENT": {
"apiAdded": 29,
"apiDeprecated": null,
"apiReplaced": null,
"name": "USE_FULL_SCREEN_INTENT",
"description": "Required for apps targeting Build.VERSION_CODES.Q that want to use notification full screen intents.",
"descriptionLong": "Required for apps targeting <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/os/Build.VERSION_CODES#Q\">Build.VERSION_CODES.Q</a></code> that want to use <code translate=\"no\" dir=\"ltr\"><a href=\"https://developer.android.com/reference/android/app/Notification.Builder#setFullScreenIntent(android.app.PendingIntent,%20boolean)\">notification full screen intents</a></code>.",
"constant": "android.permission.USE_FULL_SCREEN_INTENT",
"protection": "normal",
"warning": null
},
"USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER",
"description": "Allows to read device identifiers and use ICC based authentication like EAP-AKA.",
"descriptionLong": "Often required in authentication to access the carrier's server and manage services of the subscriber.",
"constant": "android.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER",
"protection": "signature|appop",
"warning": null
},
"USE_SIP": {
"apiAdded": 9,
"apiDeprecated": null,
"apiReplaced": null,
"name": "USE_SIP",
"description": "Allows an application to use SIP service.",
"descriptionLong": null,
"constant": "android.permission.USE_SIP",
"protection": "dangerous",
"warning": null
},
"UWB_RANGING": {
"apiAdded": 31,
"apiDeprecated": null,
"apiReplaced": null,
"name": "UWB_RANGING",
"description": "Required to be able to range to devices using ultra-wideband.",
"descriptionLong": null,
"constant": "android.permission.UWB_RANGING",
"protection": "dangerous",
"warning": null
},
"VIBRATE": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "VIBRATE",
"description": "Allows access to the vibrator.",
"descriptionLong": null,
"constant": "android.permission.VIBRATE",
"protection": "normal",
"warning": null
},
"WAKE_LOCK": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WAKE_LOCK",
"description": "Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming.",
"descriptionLong": null,
"constant": "android.permission.WAKE_LOCK",
"protection": "normal",
"warning": null
},
"WRITE_APN_SETTINGS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_APN_SETTINGS",
"description": "Allows applications to write the apn settings and read sensitive fields of an existing apn settings like user and password.",
"descriptionLong": null,
"constant": "android.permission.WRITE_APN_SETTINGS",
"protection": null,
"warning": null
},
"WRITE_CALENDAR": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_CALENDAR",
"description": "Allows an application to write the user's calendar data.",
"descriptionLong": null,
"constant": "android.permission.WRITE_CALENDAR",
"protection": "dangerous",
"warning": null
},
"WRITE_CALL_LOG": {
"apiAdded": 16,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_CALL_LOG",
"description": "Allows an application to write (but not read) the user's call log data.",
"descriptionLong": null,
"constant": "android.permission.WRITE_CALL_LOG",
"protection": "dangerous",
"warning": null
},
"WRITE_CONTACTS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_CONTACTS",
"description": "Allows an application to write the user's contacts data.",
"descriptionLong": null,
"constant": "android.permission.WRITE_CONTACTS",
"protection": "dangerous",
"warning": null
},
"WRITE_EXTERNAL_STORAGE": {
"apiAdded": 4,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_EXTERNAL_STORAGE",
"description": "Allows an application to write to external storage.",
"descriptionLong": null,
"constant": "android.permission.WRITE_EXTERNAL_STORAGE",
"protection": "dangerous",
"warning": null
},
"WRITE_GSERVICES": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_GSERVICES",
"description": "Allows an application to modify the Google service map.",
"descriptionLong": null,
"constant": "android.permission.WRITE_GSERVICES",
"protection": null,
"warning": null
},
"WRITE_SECURE_SETTINGS": {
"apiAdded": 3,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_SECURE_SETTINGS",
"description": "Allows an application to read or write the secure system settings.",
"descriptionLong": null,
"constant": "android.permission.WRITE_SECURE_SETTINGS",
"protection": null,
"warning": null
},
"WRITE_SETTINGS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_SETTINGS",
"description": "Allows an application to read or write the system settings.",
"descriptionLong": null,
"constant": "android.permission.WRITE_SETTINGS",
"protection": "signature|preinstalled|appop|pre23",
"warning": null
},
"WRITE_SYNC_SETTINGS": {
"apiAdded": 1,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_SYNC_SETTINGS",
"description": "Allows applications to write the sync settings.",
"descriptionLong": null,
"constant": "android.permission.WRITE_SYNC_SETTINGS",
"protection": "normal",
"warning": null
},
"WRITE_VOICEMAIL": {
"apiAdded": 21,
"apiDeprecated": null,
"apiReplaced": null,
"name": "WRITE_VOICEMAIL",
"description": "Allows an application to modify and remove existing voicemails in the system.",
"descriptionLong": null,
"constant": "com.android.voicemail.permission.WRITE_VOICEMAIL",
"protection": "signature|privileged|role",
"warning": null
}
}
{
"NSBluetoothAlwaysUsageDescription": {
"apiAdded": "iOS 13.0+ tvOS 13.0+ watchOS 6.0+",
"apiDeprecated": false,
"framework": "Core Bluetooth",
"name": "NSBluetoothAlwaysUsageDescription",
"description": "A message that tells the user why the app needs access to Bluetooth.",
"warning": "If your app has a deployment target earlier than iOS 13, add the NSBluetoothPeripheralUsageDescription key to your app’s Information Property List file in addition to this key."
},
"NSBluetoothPeripheralUsageDescription": {
"apiAdded": "iOS 6.0–13.0",
"apiDeprecated": true,
"framework": "Core Bluetooth",
"name": "NSBluetoothPeripheralUsageDescription",
"description": "A message that tells the user why the app is requesting the ability to connect to Bluetooth peripherals.",
"warning": "This key is required if your app uses APIs that access Bluetooth peripherals and has a deployment target earlier than iOS 13."
},
"NSCalendarsUsageDescription": {
"apiAdded": "iOS 6.0+ macOS 10.14+",
"apiDeprecated": false,
"framework": "EventKit",
"name": "NSCalendarsUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s calendar data.",
"warning": "This key is required if your app uses APIs that access the user’s calendar data."
},
"NSRemindersUsageDescription": {
"apiAdded": "iOS 6.0+ macOS 10.14+",
"apiDeprecated": false,
"framework": "EventKit",
"name": "NSRemindersUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s reminders.",
"warning": "This key is required if your app uses APIs that access the user’s reminders."
},
"NSCameraUsageDescription": {
"apiAdded": "iOS 7.0+ macOS 10.14+",
"apiDeprecated": false,
"framework": "AVFoundation",
"name": "NSCameraUsageDescription",
"description": "A message that tells the user why the app is requesting access to the device’s camera.",
"warning": "This key is required if your app uses APIs that access the device’s camera."
},
"NSMicrophoneUsageDescription": {
"apiAdded": "iOS 7.0+ macOS 10.14+ watchOS 4.0+",
"apiDeprecated": false,
"framework": "AVFoundation",
"name": "NSMicrophoneUsageDescription",
"description": "A message that tells the user why the app is requesting access to the device’s microphone.",
"warning": "This key is required if your app uses APIs that access the device’s microphone."
},
"NSContactsUsageDescription": {
"apiAdded": "iOS 6.0+ macOS 10.8+",
"apiDeprecated": false,
"framework": "Contacts",
"name": "NSContactsUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s contacts.",
"warning": "This key is required if your app uses APIs that access the user’s contacts."
},
"NSFaceIDUsageDescription": {
"apiAdded": "iOS 11.0+",
"apiDeprecated": false,
"framework": "Local Authentication",
"name": "NSFaceIDUsageDescription",
"description": "A message that tells the user why the app is requesting the ability to authenticate with Face ID.",
"warning": "This key is required if your app uses APIs that access Face ID."
},
"NSDesktopFolderUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSDesktopFolderUsageDescription",
"description": "A message that tells the user why the app needs access to the user’s Desktop folder.",
"warning": null
},
"NSDocumentsFolderUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSDocumentsFolderUsageDescription",
"description": "A message that tells the user why the app needs access to the user’s Documents folder.",
"warning": null
},
"NSDownloadsFolderUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSDownloadsFolderUsageDescription",
"description": "A message that tells the user why the app needs access to the user’s Downloads folder.",
"warning": null
},
"NSNetworkVolumesUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSNetworkVolumesUsageDescription",
"description": "A message that tells the user why the app needs access to files on a network volume.",
"warning": null
},
"NSRemovableVolumesUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSRemovableVolumesUsageDescription",
"description": "A message that tells the user why the app needs access to files on a removable volume.",
"warning": null
},
"NSFileProviderPresenceUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSFileProviderPresenceUsageDescription",
"description": "A message that tells the user why the app needs to be informed when other apps access files that it manages.",
"warning": null
},
"NSFileProviderDomainUsageDescription": {
"apiAdded": "macOS 10.15+",
"apiDeprecated": false,
"framework": "Foundation",
"name": "NSFileProviderDomainUsageDescription",
"description": "A message that tells the user why the app needs access to files managed by a file provider.",
"warning": null
},
"NSGKFriendListUsageDescription": {
"apiAdded": "iOS 14.5+",
"apiDeprecated": false,
"framework": "GameKit",
"name": "NSGKFriendListUsageDescription",
"description": "A message that tells the user why the app needs access to their Game Center friends list.",
"warning": null
},
"NSHealthClinicalHealthRecordsShareUsageDescription": {
"apiAdded": "iOS 12.0+",
"apiDeprecated": false,
"framework": "HealthKit",
"name": "NSHealthClinicalHealthRecordsShareUsageDescription",
"description": "A message to the user that explains why the app requested permission to read clinical records.",
"warning": "This key is required if your app uses APIs that access the user's clinical records."
},
"NSHealthShareUsageDescription": {
"apiAdded": "iOS 8.0+",
"apiDeprecated": false,
"framework": "HealthKit",
"name": "NSHealthShareUsageDescription",
"description": "A message to the user that explains why the app requested permission to read samples from the HealthKit store.",
"warning": "This key is required if your app uses APIs that access the user’s heath data."
},
"NSHealthUpdateUsageDescription": {
"apiAdded": "iOS 8.0+",
"apiDeprecated": false,
"framework": "HealthKit",
"name": "NSHealthUpdateUsageDescription",
"description": "A message to the user that explains why the app requested permission to save samples to the HealthKit store.",
"warning": "This key is required if your app uses APIs that update the user’s health data."
},
"NSHomeKitUsageDescription": {
"apiAdded": "iOS 8.0+ watchOS 2.0+",
"apiDeprecated": false,
"framework": "HomeKit",
"name": "NSHomeKitUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s HomeKit configuration data.",
"warning": "This key is required if your app uses APIs that access the user’s HomeKit configuration data."
},
"NSLocationAlwaysAndWhenInUseUsageDescription": {
"apiAdded": "iOS 11.0+",
"apiDeprecated": false,
"framework": "Core Location",
"name": "NSLocationAlwaysAndWhenInUseUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s location information at all times.",
"warning": "This key is required if your iOS app uses APIs that access the user’s location information at all times."
},
"NSLocationUsageDescription": {
"apiAdded": "iOS 6.0–8.0 macOS 10.14+",
"apiDeprecated": true,
"framework": "Core Location",
"name": "NSLocationUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s location information.",
"warning": "This key is required if your macOS app uses APIs that access the user’s location information."
},
"NSLocationWhenInUseUsageDescription": {
"apiAdded": "iOS 11.0+",
"apiDeprecated": false,
"framework": "Core Location",
"name": "NSLocationWhenInUseUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s location information while the app is running in the foreground.",
"warning": "This key is required if your iOS app uses APIs that access the user’s location information while the app is in use."
},
"NSLocationAlwaysUsageDescription": {
"apiAdded": "iOS 8.0–10.0",
"apiDeprecated": true,
"framework": "Core Location",
"name": "NSLocationAlwaysUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user's location at all times.DeprecatedFor apps deployed to targets in iOS 11 and later, use NSLocationAlwaysAndWhenInUseUsageDescription instead.",
"warning": "This key is required if your iOS app uses APIs that access the user’s location at all times and deploys to targets earlier than iOS 11."
},
"NSAppleMusicUsageDescription": {
"apiAdded": "iOS 2.0+",
"apiDeprecated": false,
"framework": "Media Player",
"name": "NSAppleMusicUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s media library.",
"warning": "This key is required if your app uses APIs that access the user’s media library."
},
"NSMotionUsageDescription": {
"apiAdded": "iOS 7.0+ macOS 10.15+",
"apiDeprecated": false,
"framework": "Core Motion",
"name": "NSMotionUsageDescription",
"description": "A message that tells the user why the app is requesting access to the device’s motion data.",
"warning": "This key is required if your app uses APIs that access the device’s motion data, including CMSensorRecorder, CMPedometer, CMMotionActivityManager, and CMMovementDisorderManager. If you don’t include this key, your app will crash when it attempts to access motion data."
},
"NSFallDetectionUsageDescription": {
"apiAdded": "watchOS 7.2+",
"apiDeprecated": false,
"framework": "Core Motion",
"name": "NSFallDetectionUsageDescription",
"description": "A message to the user that explains the app’s request for permission to access fall detection event data.",
"warning": "If your app uses the CMFallDetectionManager, the app requires this key."
},
"NSLocalNetworkUsageDescription": {
"apiAdded": "iOS 14.0+ macOS 11.0+ tvOS 14.0+",
"apiDeprecated": false,
"framework": "Network",
"name": "NSLocalNetworkUsageDescription",
"description": "A message that tells the user why the app is requesting access to the local network.",
"warning": null
},
"NSNearbyInteractionUsageDescription": {
"apiAdded": "iOS 15.0+ Beta watchOS 8.0+ Beta",
"apiDeprecated": false,
"framework": "Nearby Interaction",
"name": "NSNearbyInteractionUsageDescription",
"description": "A request for user permission to begin an interaction session with nearby devices.",
"warning": null
},
"NSNearbyInteractionAllowOnceUsageDescription": {
"apiAdded": "iOS 14.0–15.0",
"apiDeprecated": true,
"framework": "Nearby Interaction",
"name": "NSNearbyInteractionAllowOnceUsageDescription",
"description": "A one-time request for user permission to begin an interaction session with nearby devices.",
"warning": null
},
"NFCReaderUsageDescription": {
"apiAdded": "iOS 11.0+",
"apiDeprecated": false,
"framework": "Core NFC",
"name": "NFCReaderUsageDescription",
"description": "A message that tells the user why the app is requesting access to the device’s NFC hardware.",
"warning": "You’re required to provide this key if your app uses APIs that access the NFC hardware."
},
"NSPhotoLibraryAddUsageDescription": {
"apiAdded": "iOS 11.0+",
"apiDeprecated": false,
"framework": "Photos",
"name": "NSPhotoLibraryAddUsageDescription",
"description": "A message that tells the user why the app is requesting add-only access to the user’s photo library.",
"warning": "This key is required if your app uses APIs that have write access to the user’s photo library."
},
"NSPhotoLibraryUsageDescription": {
"apiAdded": "iOS 6.0+ macOS 10.14+",
"apiDeprecated": false,
"framework": "Photos",
"name": "NSPhotoLibraryUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s photo library.",
"warning": "This key is required if your app uses APIs that have read or write access to the user’s photo library."
},
"NSUserTrackingUsageDescription": {
"apiAdded": "iOS 14.0+ tvOS 14.0+",
"apiDeprecated": false,
"framework": "Security",
"name": "NSUserTrackingUsageDescription",
"description": "A message that informs the user why an app is requesting permission to use data for tracking the user or the device.",
"warning": null
},
"NSAppleEventsUsageDescription": {
"apiAdded": "macOS 10.14+",
"apiDeprecated": false,
"framework": "Security",
"name": "NSAppleEventsUsageDescription",
"description": "A message that tells the user why the app is requesting the ability to send Apple events.",
"warning": "This key is required if your app uses APIs that send Apple events."
},
"NSSystemAdministrationUsageDescription": {
"apiAdded": "macOS 10.14+",
"apiDeprecated": false,
"framework": "Security",
"name": "NSSystemAdministrationUsageDescription",
"description": "A message in macOS that tells the user why the app is requesting to manipulate the system configuration.",
"warning": "This key is required if your app uses APIs that manipulate the system configuration."
},
"NSSensorKitUsageDescription": {
"apiAdded": "iOS 14.0+",
"apiDeprecated": false,
"framework": "SensorKit",
"name": "NSSensorKitUsageDescription",
"description": "No overview available.",
"warning": null
},
"NSSiriUsageDescription": {
"apiAdded": "iOS 10.0+",
"apiDeprecated": false,
"framework": "Intents",
"name": "NSSiriUsageDescription",
"description": "A message that tells the user why the app is requesting to send user data to Siri.",
"warning": "This key is required if your app uses APIs that send user data to Siri."
},
"NSSpeechRecognitionUsageDescription": {
"apiAdded": "iOS 10.0+ macOS 10.15+",
"apiDeprecated": false,
"framework": "Speech",
"name": "NSSpeechRecognitionUsageDescription",
"description": "A message that tells the user why the app is requesting to send user data to Apple’s speech recognition servers.",
"warning": "This key is required if your app uses APIs that send user data to Apple’s speech recognition servers."
},
"NSVideoSubscriberAccountUsageDescription": {
"apiAdded": "tvOS 12.0+",
"apiDeprecated": false,
"framework": "TVUIKit",
"name": "NSVideoSubscriberAccountUsageDescription",
"description": "A message that tells the user why the app is requesting access to the user’s TV provider account.",
"warning": "This key is required if your app uses APIs that access the user’s TV provider account."
}
}
{
"dependencies": {
"cheerio": "^1.0.0-rc.10",
"node-fetch": "^2.6.1",
"puppeteer": "^10.1.0"
}
}
const fetch = require('node-fetch');
const cheerio = require('cheerio');
const path = require('path');
const fs = require('fs');
/** @type {cheerio.CheerioAPI} */
let $;
const outputPath = path.join(__dirname, 'android.json');
async function scrape() {
const response = await fetch(`https://developer.android.com/reference/android/Manifest.permission`);
const html = await response.text();
$ = cheerio.load(html);
// Find all `div[data-version-added="XX"]` elements containing permissions
const output = $('div[data-version-added]')
.toArray()
.map($el => getPermissionDetails($el))
.filter(Boolean);
fs.writeFileSync(
outputPath,
JSON.stringify(Object.fromEntries(output.map(permission => [permission.name, permission])), null, 2),
);
}
scrape()
.then(() => console.log('All done!'))
.catch(e => console.error('FAILED', e));
/**
* @param {cheerio.Element} $el
*/
function getPermissionDetails($el) {
// skip if it has an id of `jd-content`
if ($el.attribs['id'] === 'jd-content') {
return;
}
const apiAdded = $el.attribs['data-version-added'];
const apiDeprecated = $el.attribs['data-version-deprecated'];
const name = $($el).find('h3.api-name[id]').get(0).attribs['id'];
const $warning = $($el).find('p.caution');
const warning = $($warning).text() || undefined;
const apiReplaced = $($warning).find('code a[href]').text() || undefined;
const $paragraphs = $($el).find('p').toArray();
const $constant = $paragraphs.find($p => $($p).text().toLowerCase().startsWith('constant value:'));
const $protection = $paragraphs.find($p => $($p).text().toLowerCase().startsWith('protection level:'));
const $description = $paragraphs.filter($p => $p !== $constant && $p !== $protection);
let descriptionShort = $($description[0]).text().trim().replace(/\n/gi, ' ').replace(/\s+/gi, ' ');
if (descriptionShort.split('. ').length > 1) {
descriptionShort = descriptionShort.split('. ')[0] + '.';
}
let descriptionLong = $($description).html().trim().replace(/\n/gi, ' ').replace(/\s+/gi, ' ').replace(/<a href="\/reference\//gi, '<a href="https://developer.android.com/reference/');
if (descriptionShort === descriptionLong) {
descriptionLong = null;
} else {
descriptionLong = descriptionLong.replace(descriptionShort, '').trim();
}
return {
apiAdded: Number(apiAdded),
apiDeprecated: apiDeprecated ? Number(apiDeprecated) : null,
apiReplaced: apiReplaced ? apiReplaced.trim() : null,
name,
description: descriptionShort,
descriptionLong,
constant: $($constant).text().split(':')[1].trim().replace(/"/gi, ''),
protection: $protection ? $($protection).text().split(':')[1].trim() : null,
warning: warning ? warning.trim().replace(/\n/gi, ' ').replace(/\s+/gi, ' ') : null,
};
}
const fetch = require('node-fetch');
const cheerio = require('cheerio');
const path = require('path');
const fs = require('fs');
const puppeteer = require('puppeteer');
const outputPath = path.join(__dirname, 'ios.json');
async function scrape() {
const browser = await puppeteer.launch();
const index = await browser.newPage();
const html = await Promise.resolve()
.then(() => index.goto(`https://developer.apple.com/documentation/bundleresources/information_property_list/protected_resources`))
.then(() => index.waitForSelector('h1.title'))
.then(() => index.content());
await index.close();
const usages = html.match(/([a-z]+)UsageDescription/gi);
const usagesUnique = Array.from(new Set(usages));
const output = {};
for (const usage of usagesUnique) {
console.log('Fetching information for', usage);
const page = await browser.newPage();
const permission = await getPermissionDetails(page, usage);
if (permission && permission.name) {
output[permission.name] = permission;
}
await page.close();
}
await browser.close();
fs.writeFileSync(outputPath, JSON.stringify(output, null, 2));
}
scrape()
.then(() => console.log('All done!'))
.catch(e => console.error('FAILED', e));
/**
* @param {puppeteer.Page} page
* @param {string} usage
*/
async function getPermissionDetails(page, usage) {
const html = await Promise.resolve()
.then(() => page.goto(`https://developer.apple.com/documentation/bundleresources/information_property_list/${usage}`))
.then(() => page.waitForSelector('h1.title'))
.then(() => page.content());
const $ = cheerio.load(html);
const name = $('h1.title').text().trim();
const description = $('div.description').text().trim();
if (name.includes('can’t be found')) {
return null;
}
const $warning = $('aside.important p');
const $warningContent = $warning.toArray().filter($p => !$($p).hasClass('label'));
const warning = $($warningContent).text().trim();
const apiAdded = $('div.availability li.platform').text().replace(/deprecated/gi, '').trim();
const apiDeprecated = $('div.availability .badge-deprecated').text().trim().toLowerCase() === 'deprecated';
const framework = $('div.frameworks span.name').text().trim();
return {
apiAdded: apiAdded || null,
apiDeprecated: apiDeprecated ? true : false,
framework: framework || null,
name,
description,
warning: warning || null,
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment