Android 6.0 权限管理工具类
2016-08-16 本文已影响941人
332ad49fb8f6
工具类实现
public class EasyPermission {
public static final int SETTINGS_REQ_CODE = 16061;
public interface PermissionCallback extends ActivityCompat.OnRequestPermissionsResultCallback {
void onPermissionGranted(int requestCode, List<String> perms);
void onPermissionDenied(int requestCode, List<String> perms);
}
private Object object;
private String[] mPermissions;
private String mRationale;
private int mRequestCode;
@StringRes private int mPositiveButtonText = android.R.string.ok;
@StringRes private int mNegativeButtonText = android.R.string.cancel;
private EasyPermission(Object object) {
this.object = object;
}
public static EasyPermission with(Activity activity) {
return new EasyPermission(activity);
}
public static EasyPermission with(Fragment fragment) {
return new EasyPermission(fragment);
}
public EasyPermission permissions(String... permissions) {
this.mPermissions = permissions;
return this;
}
public EasyPermission rationale(String rationale) {
this.mRationale = rationale;
return this;
}
public EasyPermission addRequestCode(int requestCode) {
this.mRequestCode = requestCode;
return this;
}
public EasyPermission positveButtonText(@StringRes int positiveButtonText) {
this.mPositiveButtonText = positiveButtonText;
return this;
}
public EasyPermission nagativeButtonText(@StringRes int negativeButtonText) {
this.mNegativeButtonText = negativeButtonText;
return this;
}
public void request() {
requestPermissions(object, mRationale, mPositiveButtonText, mNegativeButtonText, mRequestCode,
mPermissions);
}
/**
* Check if the calling context has a set of permissions.
*/
public static boolean hasPermissions(Context context, String... perms) {
// Always return true for SDK < M, let the system deal with the permissions
if (!UIUtils.isOverMarshmallow()) {
return true;
}
for (String perm : perms) {
boolean hasPerm =
(ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_GRANTED);
if (!hasPerm) {
return false;
}
}
return true;
}
/**
* Request a set of permissions, showing rationale if the system requests it.
*/
public static void requestPermissions(final Object object, String rationale, final int requestCode,
final String... perms) {
requestPermissions(object, rationale, android.R.string.ok, android.R.string.cancel, requestCode,
perms);
}
/**
* Request a set of permissions, showing rationale if the system requests it.
*/
public static void requestPermissions(final Object object, String rationale,
@StringRes int positiveButton, @StringRes int negativeButton, final int requestCode,
final String... permissions) {
checkCallingObjectSuitability(object);
PermissionCallback mCallBack = (PermissionCallback) object;
if (!UIUtils.isOverMarshmallow()) {
mCallBack.onPermissionGranted(requestCode, Arrays.asList(permissions));
return;
}
final List<String> deniedPermissions =
UIUtils.findDeniedPermissions(UIUtils.getActivity(object), permissions);
boolean shouldShowRationale = false;
for (String perm : deniedPermissions) {
shouldShowRationale =
shouldShowRationale || UIUtils.shouldShowRequestPermissionRationale(object, perm);
}
if (UIUtils.isEmpty(deniedPermissions)) {
mCallBack.onPermissionGranted(requestCode, Arrays.asList(permissions));
} else {
final String[] deniedPermissionArray =
deniedPermissions.toArray(new String[deniedPermissions.size()]);
if (shouldShowRationale) {
Activity activity = UIUtils.getActivity(object);
if (null == activity) {
return;
}
new AlertDialog.Builder(activity).setMessage(rationale)
.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
executePermissionsRequest(object, deniedPermissionArray, requestCode);
}
})
.setNegativeButton(negativeButton, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
// act as if the permissions were denied
((PermissionCallback) object).onPermissionDenied(requestCode,
deniedPermissions);
}
})
.create()
.show();
} else {
executePermissionsRequest(object, deniedPermissionArray, requestCode);
}
}
}
@TargetApi(23)
private static void executePermissionsRequest(Object object, String[] perms, int requestCode) {
checkCallingObjectSuitability(object);
if (object instanceof Activity) {
ActivityCompat.requestPermissions((Activity) object, perms, requestCode);
} else if (object instanceof Fragment) {
((Fragment) object).requestPermissions(perms, requestCode);
} else if (object instanceof android.app.Fragment) {
((android.app.Fragment) object).requestPermissions(perms, requestCode);
}
}
/**
* Handle the result of a permission request.
*/
public static void onRequestPermissionsResult(Object object, int requestCode, String[] permissions,
int[] grantResults) {
checkCallingObjectSuitability(object);
PermissionCallback mCallBack = (PermissionCallback) object;
List<String> deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[i]);
}
}
if (UIUtils.isEmpty(deniedPermissions)) {
mCallBack.onPermissionGranted(requestCode, Arrays.asList(permissions));
} else {
mCallBack.onPermissionDenied(requestCode, deniedPermissions);
}
}
/**
* with a {@code null} argument for the negative buttonOnClickListener.
*/
public static boolean checkDeniedPermissionsNeverAskAgain(final Object object, String rationale,
@StringRes int positiveButton, @StringRes int negativeButton, List<String> deniedPerms) {
return checkDeniedPermissionsNeverAskAgain(object, rationale, positiveButton, negativeButton, null,
deniedPerms);
}
/**
* 在OnActivityResult中接收判断是否已经授权
* 使用{@link EasyPermission#hasPermissions(Context, String...)}进行判断
*
* If user denied permissions with the flag NEVER ASK AGAIN, open a dialog explaining the
* permissions rationale again and directing the user to the app settings. After the user
* returned to the app, {@link Activity#onActivityResult(int, int, Intent)} or
* {@link Fragment#onActivityResult(int, int, Intent)} or
* {@link android.app.Fragment#onActivityResult(int, int, Intent)} will be called with
* {@value #SETTINGS_REQ_CODE} as requestCode
* <p>
*
* NOTE: use of this method is optional, should be called from
* {@link PermissionCallback#onPermissionDenied(int, List)}
*
* @return {@code true} if user denied at least one permission with the flag NEVER ASK AGAIN.
*/
public static boolean checkDeniedPermissionsNeverAskAgain(final Object object, String rationale,
@StringRes int positiveButton, @StringRes int negativeButton,
@Nullable DialogInterface.OnClickListener negativeButtonOnClickListener,
List<String> deniedPerms) {
boolean shouldShowRationale;
for (String perm : deniedPerms) {
shouldShowRationale = UIUtils.shouldShowRequestPermissionRationale(object, perm);
if (!shouldShowRationale) {
final Activity activity = UIUtils.getActivity(object);
if (null == activity) {
return true;
}
new AlertDialog.Builder(activity).setMessage(rationale)
.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
startAppSettingsScreen(object, intent);
}
})
.setNegativeButton(negativeButton, negativeButtonOnClickListener)
.create()
.show();
return true;
}
}
return false;
}
@TargetApi(11) private static void startAppSettingsScreen(Object object, Intent intent) {
if (object instanceof Activity) {
((Activity) object).startActivityForResult(intent, SETTINGS_REQ_CODE);
} else if (object instanceof Fragment) {
((Fragment) object).startActivityForResult(intent, SETTINGS_REQ_CODE);
} else if (object instanceof android.app.Fragment) {
((android.app.Fragment) object).startActivityForResult(intent, SETTINGS_REQ_CODE);
}
}
private static void checkCallingObjectSuitability(Object object) {
if (!((object instanceof Fragment)
|| (object instanceof Activity)
|| (object instanceof android.app.Fragment))) {
throw new IllegalArgumentException("Caller must be an Activity or a Fragment.");
}
if (!(object instanceof PermissionCallback)) {
throw new IllegalArgumentException("Caller must implement PermissionCallback.");
}
}
}
简单使用例子
implements EasyPermission.PermissionCallback
然后在onRequestPermissionsResult里面调下面的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
EasyPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
onPermissionGranted
用户授予所有权限
onPermissionDenied
用户拒绝至少一个权限
申请权限
EasyPermission.with(this)
.addRequestCode(RC_CAMERA_AND_AUDIO)
.permissions(new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA})
.rationale(getString(R.string.rationale_camera_audio))
.request();