Normal Permission in Android — what it is, protection levels and how it works

Author: IT Sectr Published: 2026-05-20 Reading time: 8 min

Normal Permission is a category of permissions in Android that the system grants automatically without asking the user. According to Android Developer Documentation, 2024, normal permissions have ProtectionLevel normal and do not require a runtime dialog, unlike dangerous ones. They cover access to the internet, network state and vibration, without creating risks for the user’s sensitive data.

Key Takeaways

  • Normal Permission is a category of Android permissions with ProtectionLevel normal, granted automatically upon installation.
  • To use it, just add uses-permission to the manifest — no dialog is shown to the user.
  • The main difference from dangerous ones is the absence of a runtime request and the inability to revoke it through settings.
  • The list includes INTERNET, ACCESS_NETWORK_STATE, VIBRATE, ACCESS_WIFI_STATE and other system constants.
  • You can check the protection level via PackageManager.getPermissionInfo in the application code.

What is Normal Permission in Android

Normal Permission is a type of system permission in Android with ProtectionLevel normal, granted to an application automatically at installation time. The developer does not need to write code to request it — just declare the permission in AndroidManifest.xml. The user sees no dialogs and cannot revoke a normal permission separately, only by uninstalling the entire application.

The Android system classifies normal permissions as low-risk — they do not grant access to personal data, camera or microphone. Typical examples: internet access, vibration control, reading Wi-Fi state. According to Android Security Model (2024), about 40 percent of all system permissions belong to the normal category.

An important property — normal permissions cannot be revoked at runtime through Settings. If the user wants to deny access, the only way is to uninstall the application. Developers should consider this in their architecture, but for users this approach simplifies interaction: no dialogs on first launch.

History of the category

The division into normal and dangerous permissions appeared in Android 6.0 Marshmallow (API 23). Before this version, all permissions were requested at installation — the user saw a single list and accepted or declined it as a whole. Normal Permission retained this model for low-risk operations, while Dangerous switched to runtime requests. This change improved user experience and enhanced security at the same time.

Which APIs require Normal Permission

Many Android system APIs require explicit declaration of a normal permission, even if the access is automatic. For example, the ConnectivityManager class requires ACCESS_NETWORK_STATE, VibratorService requires VIBRATE, WifiManager requires ACCESS_WIFI_STATE. Without declaring the corresponding uses-permission, calling these APIs will result in a SecurityException.

How ProtectionLevel normal works

ProtectionLevel normal is the minimum protection level in the Android Permission System. Permissions with this level are declared in the manifest, and the system checks the declaration at installation, granting access without user intervention. No UI elements are shown, no callbacks are invoked.

The verification mechanism works at the PackageManager level. During APK installation, the system scans all uses-permission tags, determines the protection level of each permission by matching against system definitions in permissions.xml files, and for normal-level simply registers the access. The process takes milliseconds and requires no interaction with the user interface.

The granting algorithm works as follows:

  • The system reads the manifest at the moment of application installation
  • It matches the protectionLevel in /etc/permissions/ on the device
  • If the value is normal — automatically grants access
  • The permission remains active until the application is completely uninstalled

The user cannot revoke a normal permission through the interface. In the application settings under the Permissions section, only dangerous permissions are displayed. This contrasts with iOS, where every permission requires separate confirmation regardless of the function’s sensitivity level.

Normal Permission vs Dangerous Permission

Normal and Dangerous Permission are two opposite protection categories in Android. The main difference is in the method of granting: normal ones are given automatically at installation, dangerous ones require explicit consent through a runtime dialog. This distinction is built into the Android security architecture starting from version 6.0 Marshmallow.

Comparison of key characteristics:

CharacteristicNormal PermissionDangerous Permission
ProtectionLevelnormaldangerous
User requestNot requiredRuntime dialog mandatory
RevocabilityNo, only by uninstalling the appYes, through settings at any time
Code checkAlways PERMISSION_GRANTEDcheckSelfPermission mandatory
ExamplesINTERNET, VIBRATE, ACCESS_NETWORK_STATECAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION

Difference in user request

The user sees no dialogs when requesting Normal Permission. If an app needs INTERNET — it gets it silently. For Dangerous Permission, the system shows a modal dialog describing the requested access. The user presses Allow or Deny, and can later revoke the permission at any time through Settings. This is a key UX difference that determines the interface development strategy.

When to choose Normal

Normal should be used in all cases where the access does not involve sensitive data. ACCESS_NETWORK_STATE for checking connectivity, VIBRATE for haptic feedback, INTERNET for HTTP requests — all these are normal permissions. Using a dangerous level where normal is sufficient is bad practice, creating unnecessary dialogs and reducing user trust in the application.

List of normal permissions in Android

Android defines several dozen normal permissions, each corresponding to a specific system function. All of them are available through constants of the Manifest.permission class. Below is a list of the most commonly used ones in application development.

ConstantAccessDescription
INTERNETNetworkOpening network sockets for HTTP requests
ACCESS_NETWORK_STATENetworkGetting information about network state
ACCESS_WIFI_STATEWi-FiReading Wi-Fi connection information
VIBRATEVibrationControlling the device vibrator
BLUETOOTHBluetoothConnecting to Bluetooth devices
WAKE_LOCKPowerPreventing the processor from going to sleep
SET_ALARMAlarmSetting an alarm via AlarmManager
CHANGE_NETWORK_STATENetworkChanging the network connection state

Groups of normal permissions

Normal permissions are not grouped into Permission Groups for UI display purposes. Groups in Android are intended for the settings screen, where only dangerous permissions are shown. However, normal permissions can logically be divided into categories: network (INTERNET, ACCESS_NETWORK_STATE), hardware (VIBRATE, WAKE_LOCK), system (SET_ALARM) and Bluetooth permissions.

Some constants from Manifest.permission may change their protection level on different Android versions. For example, BLUETOOTH_CONNECT on Android 12+ became a dangerous permission with a runtime request, although on older versions it was normal. Developers are advised to check the current protectionLevel for the target API through the documentation.

Checking Normal Permission via PackageManager

A developer can programmatically check whether a permission is normal via PackageManager. The getPermissionInfo method returns PermissionInfo whose protectionLevel field contains the PermissionInfo.PROTECTION_NORMAL flag. This is useful for dynamic handling and debugging.

kotlin
fun isNormalPermission(permission: String): Boolean {
    val pm = packageManager
    val info = pm.getPermissionInfo(
        permission,
        PackageManager.GET_META_DATA
    )
    return info.protectionLevel ==
        PermissionInfo.PROTECTION_NORMAL
}

How to declare Normal Permission in the manifest

Declaring Normal Permission in AndroidManifest.xml is the simplest operation, requiring just one uses-permission tag. No additional protectionLevel configuration is needed, since the protection level is determined by the system definition, not by the application manifest. The developer simply specifies the full constant name.

xml
<!-- AndroidManifest.xml -->
<uses-permission
    android:name="android.permission.INTERNET" />
<uses-permission
    android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
    android:name="android.permission.VIBRATE" />

The system processes all declarations at installation. If at least one of the declared permissions has a protectionLevel different from normal, a runtime request will be required. INTERNET is the most popular normal permission, present in most Android applications, especially those that make HTTP requests or load content from the network.

Example of a complete manifest

A complete example of AndroidManifest.xml with normal and dangerous permissions demonstrates the difference: syntactically the uses-permission tags are the same, but at runtime INTERNET and VIBRATE will be granted automatically, while CAMERA will require a dialog.

xml
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Normal permissions -->
    <uses-permission
        android:name="android.permission.INTERNET" />
    <uses-permission
        android:name="android.permission.VIBRATE" />

    <!-- Dangerous permission -->
    <uses-permission
        android:name="android.permission.CAMERA" />
</manifest>

Manifest Merger and Normal Permission

When using libraries — Google Play Services, Firebase, Glide — they may add their own uses-permission entries to the final manifest via Manifest Merger. Some of them are normal (INTERNET for Firebase), others are dangerous (ACCESS_FINE_LOCATION for Google Maps). The developer should check the final merged manifest in build/outputs/logs/manifest-merger-report.txt before publication.

Limitations of Normal Permission

Normal Permission has two fundamental limitations: the inability for the user to revoke it and the absence of a management UI. If the user does not trust the application but the normal permission has already been granted automatically — the only solution is to uninstall the application. This creates a certain risk since normal permissions cannot be blocked by standard Android means.

An additional limitation appears on devices with multiple profiles (Work Profile, Multiple Users). Normal Permission is granted to all profiles at once — the application cannot restrict the permission to just one. In enterprise scenarios this is addressed through Managed Configurations.

It is impossible to check whether an application is using a Normal Permission at a given moment. The system method checkSelfPermission works only for dangerous permissions. For normal ones it always returns PERMISSION_GRANTED, which does not reflect actual activity. This should be considered during security audits and application behavior analysis.

It is also worth remembering that some device manufacturers (Xiaomi, Huawei, Samsung) modify the standard permission behavior. On their firmware, Normal Permission may require additional permissions in the proprietary MIUI or EMUI shell. Developers are advised to test on real devices from different vendors.

Frequently Asked Questions

How is Normal Permission different from Dangerous?

Normal Permission is granted automatically at installation without a dialog. Dangerous requires a runtime request with explicit user consent and can be revoked through settings. Normal uses ProtectionLevel normal, Dangerous uses protectionLevel dangerous.

Do I need to write code for Normal Permission?

No, for normal permissions it is enough to declare uses-permission in AndroidManifest.xml. No request code is required — the system grants access automatically. This distinguishes them from dangerous ones, where ActivityCompat.requestPermissions is needed.

Which Normal Permissions are the most popular?

The most commonly used ones are: INTERNET (network requests), ACCESS_NETWORK_STATE (connectivity check), VIBRATE (haptic feedback) and WAKE_LOCK (keeping the processor awake). Practically every Android application uses at least INTERNET.

Can Normal Permission be revoked?

No, Normal Permission cannot be revoked through the application settings. The only way to stop access is to uninstall the application. This is a key difference from dangerous permissions, which the user can disable at any time.

How to check the ProtectionLevel of a permission?

Use PackageManager.getPermissionInfo, passing the string name of the permission. The method returns PermissionInfo with a protectionLevel field. Compare it with the constants PermissionInfo.PROTECTION_NORMAL or PROTECTION_DANGEROUS to determine the category.

Summary

  • Normal Permission is a category of Android permissions with ProtectionLevel normal, granted automatically at installation.
  • To declare it, just use the uses-permission tag in AndroidManifest.xml without runtime code.
  • They differ from dangerous ones by the absence of a dialog, inability to revoke, and low risk level.
  • The most popular ones: INTERNET, ACCESS_NETWORK_STATE, VIBRATE, ACCESS_WIFI_STATE and WAKE_LOCK.
  • ProtectionLevel is checked via PackageManager.getPermissionInfo in code.
  • Normal permissions are not shown in the application settings screen.
  • When using libraries, check the final manifest via Manifest Merger.

We will develop a mobile application turnkey

IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.

Discuss the project

Read also