核心代码 PermissionDelegate
package com.maibei.mall.utils;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.content.PermissionChecker;
public class PermissionDelegate {
private static final String TAG = "PermissionDelegate";
private static final String PACKAGE_URL_SCHEME = "package:";
public interface Callback {
void onPermissionsSuccess();
void onPermissionsFailed();
}
private Activity mActivity;
private Callback mCallback;
public PermissionDelegate(Activity activity) {
this.mActivity = activity;
}
@RequiresApi(api = Build.VERSION_CODES.M)
public boolean lackPermissions(String[] permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return false;
}
for (String permission : permissions) {
if (PermissionChecker.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
return true;
}
}
return true;
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void requestPermissions(String[] permissions, Callback callback) {
mCallback = callback;
mActivity.requestPermissions(permissions, mActivity.hashCode());
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == mActivity.hashCode() && hasAllPermissionsGranted(grantResults)) {
handlePermissionsSuccess();
} else {
handlePermissionFailed();
}
}
private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
private void handlePermissionsSuccess() {
if (mCallback != null) {
mCallback.onPermissionsSuccess();
}
}
private void handlePermissionFailed() {
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setTitle("提示");
builder.setMessage("此应用缺少运行所需的必要权限。请检查您的权限设置。");
// 取消
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mCallback != null) {
mCallback.onPermissionsFailed();
}
}
});
// 设置
builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
});
builder.show();
}
private void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + mActivity.getPackageName()));
mActivity.startActivity(intent);
}
}
使用
@RequiresApi(api = Build.VERSION_CODES.M)
private void permissionHandle() {
if (!mPermissionDelegate.lackPermissions(new String[]{Manifest.permission.CAMERA})) {
// do something
} else {
mPermissionDelegate.requestPermissions(new String[]{Manifest.permission.CAMERA},
new PermissionDelegate.Callback() {
@Override
public void onPermissionsSuccess() {
// do something
}
@Override
public void onPermissionsFailed() {
// Do nothing
}
});
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// super.onRequestPermissionsResult(requestCode, permissions, grantResults);
mPermissionDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
}