PermissionAssistant is a wrapper library to simplify basic system permissions logic when targeting Android M or higher.
PermissionAssistant is installed by adding the following dependency to your build.gradle
file:
allprojects {
repositories {
maven {
url 'https://jitpack.io'
}
}
}
dependencies {
compile 'com.github.aftabsikander:PermissionAssistant:v1.0'
}
To begin using PermissionAssistant, have your Activity
(or Fragment
) override the onRequestPermissionsResult
method:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to PermissionAssistant
PermissionAssistant.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
}
The example below shows how to request permissions for a method that requires both
CAMERA
and CHANGE_WIFI_STATE
permissions. There are a few things to note:
- Using
PermissionAssistant#hasPermissions(...)
to check if the app already has the required permissions. This method can take any number of permissions as its final argument. - Requesting permissions with
PermissionAssistant#requestPermissions
. This method will request the system permissions and show the rationale string provided if necessary. The request code provided should be unique to this request, and the method can take any number of permissions as its final argument. - Use of the
AfterPermissionGranted
annotation. This is optional, but provided for convenience. If all of the permissions in a given request are granted, any methods annotated with the proper request code will be executed. This is to simplify the common flow of needing to run the requesting method after all of its permissions have been granted. This can also be achieved by adding logic on theonPermissionsGranted
callback.
@AfterPermissionGranted(RC_CAMERA_AND_WIFI)
private void methodRequiresTwoPermission() {
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.CHANGE_WIFI_STATE};
if (PermissionAssistant.hasPermissions(this, perms)) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request them now
PermissionAssistant.requestPermissions(this, getString(R.string.camera_and_wifi_rationale),
RC_CAMERA_AND_WIFI, perms);
}
}
Optionally, for a finer control, you can have your Activity
/ Fragment
implement
the PermissionCallbacks
interface.
public class MainActivity extends AppCompatActivity implements PermissionCallbacks {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to PermissionAssistant
PermissionAssistant.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, List<String> list) {
// Some permissions have been granted
// ...
}
@Override
public void onPermissionsDenied(int requestCode, List<String> list) {
// Some permissions have been denied
// ...
}
}
In some cases your app will not function properly without certain permissions. If the user
denies these permissions with the "Never Ask Again" option, you will be unable to request
these permissions from the user and they must be changed in app settings. You can use the
method PermissionAssistant.somePermissionPermanentlyDenied(...)
to display a dialog to the
user in this situation and direct them to the system setting screen for your app:
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
// This will display a dialog directing them to enable the permission in app settings.
if (PermissionAssistant.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
// Do something after user returned from app settings screen, like showing a Toast.
Toast.makeText(this, R.string.returned_from_app_settings_to_activity, Toast.LENGTH_SHORT)
.show();
}
}
- Customize Support For Rationale Dialog.
- Snack Bar Builder
- Hat tip to anyone who's code was used
- Majority of code taken from EasyPermission a big thanks to them.
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to me.