Visit GitHub Repo

Permission Requester

Build Status GitHub release Bintray


Permission Reuquester is a simple permission request activity that let you grant permissions easylly, with a standard policy, that covers all of situations relative.


Requesting permissions at run time is a new feature added from Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app. An App target at 23 or above, need to requesting the "Dangerous" permission at run time.

There is lot of things to do.

You need to Check For Permissions to see if the permissions are granted. If not, you need to Request the permissions you need, and you may need to Explain why the app needs permissions. Somethings you also need to Handle the permissions request response to do things after permission granted. What's more, if user selected "Don't ask again", you will not have a chance to requesting permissions from App, then you may need to guide user to settings to open the permissions.


Here is a workflow for permission request policy:

When you start requesting permission with PermissionRequestActivity, it will first check if we already have permission. If don't, show system permission requesting dialogs to ask for permissions. Then show a "rationale dialog" for user if he denied the permissions, or show a "go settings dialog" to guide user to settings when he click "Don't ask again".



dependencies {
    compile 'me.tankery.lib:permission-requester:1.1.0'

Gradle 3.0

dependencies {
    implementation 'me.tankery.lib:permission-requester:1.1.0'


If you don't need response when requesting finished, all you need to do is to start the PermissionRequestActivity using:

PermissionRequestActivity.start(context, PERMISSIONS, rationalMsg, goSettingsMsg);

You can even start this activity from background Service.

If you care about the requesting response, start PermissionRequestActivity from your activity:

PermissionRequestActivity.start(activity, REQUEST_CODE, PERMISSIONS, rationalMsg, goSettingsMsg);

Then, handle the activity result in onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Permission granted
        } else {
            // Permission denied

You can also override showRationaleDialog to show a custom rationale dialog when need:

 * Override this method to show custom dialog.
 * @param canRequestAgain if true, show request again dialog, else, show go settings dialog
 * @param message dialog message
 * @param dialogResult always have a result for user action
 *                     (ok - > positive/cancel -> negative/dismiss -> negative)
 * @return The custom dialog shown.
protected Dialog showRationaleDialog(final boolean canRequestAgain, String message,
                                     final @NonNull DialogResult dialogResult) {
    AlertDialog alertDialog = new AlertDialog.Builder(this)
            .setPositiveButton(android.R.string.ok, new OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i) {
            .setNegativeButton(android.R.string.cancel, new OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i) {
            .setOnCancelListener(new OnCancelListener() {
                public void onCancel(DialogInterface dialogInterface) {
    return alertDialog;


Feel free to create issues when you find some bug or have some suggestions. And Pull Request is welcome. Thanks for your attention~

Watch and learn from our free Android videos