To protect the system’s integrity and the user’s privacy, Android runs each app in a limited access sandbox. If the app wants to use resources or information outside of its sandbox, the app has to explicitly request permission. Depending on the type of permission the app requests, the system may grant the permission automatically, or the system may ask the user to grant the permission.
Declare that your app needs a permission by listing the permission in the App Manifest.
Depending on how sensitive the permission is, the system might grant the permission automatically, or the device user might have to grant the request.
For example, if your app requests permission to turn on the device’s flashlight, the system grants that permission automatically. But if your app needs to read the user’s contacts, the system asks the user to approve that permission.
Depending on the platform version, the user grants the permission either when they install the app (on Android 5.1 and lower) or while running the app (on Android 6.0 and higher).
Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app.
It gives the user more control over the app’s functionality; for example, a user could choose to give a camera app access to the camera but not to the device location. The user can revoke the permissions at any time, by going to the app’s Settings screen.
System permissions are divided into two categories
- Normal permissions do not directly risk the user’s privacy. If an app lists a normal permission in its manifest, the system grants the permission automatically. Complete list of normal permissions can be found here.
- Dangerous permissions can give the app access to the user’s confidential data. For these permissions, the user has to explicitly give approval to the app. Complete list of dangerous permissions can be found here.
Handling Permissions at Runtime
For applications to support new Runtime Permissions, in `grade.build` file set `compileSdkVersion` and `targetSdkVersion` to
Moving forward, in
<ActivityClass>.java, before accessing any restricted content we will need to check for appropriate permission at runtime. This is to be done using Android `checkSelfPermission` API.
`int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS)`
If permission is granted, we are good to go else we need to request permission.
We will need to explicitly call `requestPermissions` API to show the request permission dialog box, Android will not do this for us.
In line 5, we get current status for the permission. If permission is granted, we continue with our action else we request user for permission.
Handling Permission Results
Permission results are communicated to the app via
onRequestPermissionsResult callback method. Override this to handle the result.
If permission is granted, we continue with our intended actions.
In case, the permission is denied, check with Android if we should show a permission rationale. `shouldShowRequestPermissionRationale` allows us to communicate purpose of the permission to user.
`shouldShowRequestPermissionRationale` returns `false` if the user has denied permission with option `Never ask again`. In this case we can not invoke the Android permission dialog via `requestPermissions` API and user will have to enable permission via app settings. It makes sense to let user know of the missing permission.
`shouldShowRequestPermissionRationale` Gets whether you should show UI with rationale for requesting a permission. You should do this only if you do not have the permission and the context in which the permission is requested does not clearly communicate to the user what would be the benefit from granting this permission.
Gotcha: Above implementation only works for Android API level 23 and is not compatible with older versions.
Better Fix: Use `com.android.support:support-v4` as specified in build.gradle line 24. Now your code should use Support library and and make following changes
And we are done here!!
For targeting Android M or higher, refer to wrapper library EasyPermissions.