Created
September 19, 2017 10:49
-
-
Save linakis/1f415006ebfa366d58948f0c98275007 to your computer and use it in GitHub Desktop.
A helper class to make Android run time permission a little easier.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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