最简单动态请求权限仅需四步
1.创建Class文件 PermissionReq类 如下
public class PermissionReq {
private static int sRequestCode = 0;
private static SparseArray<PermissionResult> sResultArray = new SparseArray<>();
private Object mObject;
private String[] mPermissions;
private PermissionResult mResult;
private PermissionReq(Object object) {
mObject = object;
}
public static PermissionReq with(@NonNull Activity activity) {
return new PermissionReq(activity);
}
public static PermissionReq with(@NonNull Fragment fragment) {
return new PermissionReq(fragment);
}
public PermissionReq permissions(@NonNull String... permissions) {
mPermissions = permissions;
return this;
}
public PermissionReq result(@Nullable PermissionResult result) {
mResult = result;
return this;
}
public void request() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if (mResult != null) {
mResult.onGranted();
}
return;
}
Activity activity = getActivity(mObject);
if (activity == null) {
throw new IllegalArgumentException(mObject.getClass().getName() + " is not supported");
}
List<String> deniedPermissionList = getDeniedPermissions(activity, mPermissions);
if (deniedPermissionList.isEmpty()) {
if (mResult != null) {
mResult.onGranted();
}
return;
}
int requestCode = genRequestCode();
String[] deniedPermissions = deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
requestPermissions(mObject, deniedPermissions, requestCode);
sResultArray.put(requestCode, mResult);
}
public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
PermissionResult result = sResultArray.get(requestCode);
if (result == null) {
return;
}
sResultArray.remove(requestCode);
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
result.onDenied();
return;
}
}
result.onGranted();
}
@TargetApi(Build.VERSION_CODES.M)
private static void requestPermissions(Object object, String[] permissions, int requestCode) {
if (object instanceof Activity) {
((Activity) object).requestPermissions(permissions, requestCode);
} else if (object instanceof Fragment) {
((Fragment) object).requestPermissions(permissions, requestCode);
}
}
private static List<String> getDeniedPermissions(Context context, String[] permissions) {
List<String> deniedPermissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
deniedPermissionList.add(permission);
}
}
return deniedPermissionList;
}
private static Activity getActivity(Object object) {
if (object != null) {
if (object instanceof Activity) {
return (Activity) object;
} else if (object instanceof Fragment) {
return ((Fragment) object).getActivity();
}
}
return null;
}
private static int genRequestCode() {
return ++sRequestCode;
}
}
2.创建接口文件
public interface PermissionResult {
void onGranted();
void onDenied();
}
3.在请求的Activity中
private void getPermission() {
PermissionReq.with(xxxxActivity.this).permissions(Manifest.permission.ACCESS_COARSE_LOCATION,//定位权限等权限
Manifest.permission.ACCESS_FINE_LOCATION)
.result(new PermissionResult() {
@Override
public void onGranted() {
//请求成功
}
@Override
public void onDenied() {
//请求失败
}
})
.request();
}
4.重写onRequestPermissionsResult 如下
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionReq.onRequestPermissionsResult(requestCode, permissions, grantResults);
}