Skip to content

Instantly share code, notes, and snippets.

@linakis
Created September 19, 2017 10:49
Show Gist options
  • Save linakis/1f415006ebfa366d58948f0c98275007 to your computer and use it in GitHub Desktop.
Save linakis/1f415006ebfa366d58948f0c98275007 to your computer and use it in GitHub Desktop.
A helper class to make Android run time permission a little easier.
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.view.View;
/**
* A helper class to make run time permission a little easier.
*
* To bind the PermissionHelper with the activity you need to
* call PermissionsHelper.onRequestPermissionsResult() from the Activity.onRequestPermissionsResult()
*
* Depending on which PermissionsHelper.requestPermission() flavor is used,
* an AlertDialog for manual permission enable in application Settings will be displayed on denial (or not).
*
*/
public class PermissionsHelper {
private static final int REQ_PERMISSION = 0x1337;
private Activity mActivity;
private int mSettingsPromptResId;
public PermissionsHelper(Activity activity) {
this.mActivity = activity;
}
/**
* @param manifestPermission Manifest.permission.*
* @param rationaleResId will be displayed in a Snackbar to inform the user about needed permission
*/
public void requestPermission(final String manifestPermission, int rationaleResId) {
requestPermission(manifestPermission, rationaleResId, -1);
}
/**
* @param manifestPermission Manifest.permission.*
* @param rationaleResId will be displayed in a Snackbar to inform the user about needed permission
* @param settingsPromptResId will be displayed in an AlertDialog to prompt the user to enable permission manually from application settings
*/
public void requestPermission(final String manifestPermission, int rationaleResId, int settingsPromptResId) {
this.mSettingsPromptResId = settingsPromptResId;
if (ContextCompat.checkSelfPermission(mActivity, manifestPermission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, manifestPermission)) {
Snackbar.make(mActivity.findViewById(android.R.id.content), rationaleResId, Snackbar.LENGTH_INDEFINITE)
.setAction(android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(mActivity, new String[]{manifestPermission}, REQ_PERMISSION);
}
})
.show();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(mActivity, new String[]{manifestPermission}, REQ_PERMISSION);
}
}
}
public boolean onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQ_PERMISSION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
if(mSettingsPromptResId > 0) {
new AlertDialog.Builder(mActivity)
.setMessage(mSettingsPromptResId)
.setPositiveButton(R.string.permission_helper_settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", mActivity.getPackageName(), null);
intent.setData(uri);
mActivity.startActivity(intent);
}
}).setNegativeButton(android.R.string.cancel, null)
.show();
}
}
}
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment