转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/52786614
本文出自:猴菇先生的博客
在app中用到动态判断运行时权限的地方还是蛮多的,比如读写SD卡、获取电话信息、拍照、定位啥的,每次的重复代码也蛮多的。看了郭霖大神CSDN公开课直播Android6.0运行时权限,讲了如何封装,下面是改过之后的代码:
1、在BaseActivity中:
//6.0以上系统判断权限 --> start
private static final int RUNTIME_PERMISSION_REQUEST_CODE = 1;
private RuntimePermissionListener mRuntimePermissionListener;
/**
* 检查运行时权限
*
* @param permissions 所检查的权限数组
* @param runtimePermissionListener 运行时权限监听器
*/
public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
mRuntimePermissionListener = runtimePermissionListener;
List<String> deniedPermissionList = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {//判断权限是否允许
deniedPermissionList.add(permission);
}
}
if (deniedPermissionList.isEmpty()) {
//权限全部允许
mRuntimePermissionListener.onRuntimePermissionGranted();
} else {
String[] deniedPermissionArray = deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
//请求未允许的权限
ActivityCompat.requestPermissions(this, deniedPermissionArray, RUNTIME_PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case RUNTIME_PERMISSION_REQUEST_CODE:
if (grantResults.length > 0) {
List<String> deniedPermissionList = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissionList.add(permissions[i]);
}
}
if (deniedPermissionList.isEmpty()) { //权限全部允许
mRuntimePermissionListener.onRuntimePermissionGranted();
} else {//有拒绝的权限
mRuntimePermissionListener.onRuntimePermissionDenied();
}
}
}
}
/**
* 运行时权限监听器
*/
public interface RuntimePermissionListener {
/**
* 允许所请求的全部权限
*/
void onRuntimePermissionGranted();
/**
* 拒绝所请求的部分或全部权限
*/
void onRuntimePermissionDenied();
}
//6.0以上系统判断权限 --> end
2、在需要检查权限的activity中使用:
/**
* 请求权限
*/
private void checkRuntimePermission() {
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE
, Manifest.permission.CALL_PHONE
, Manifest.permission.ACCESS_COARSE_LOCATION};
checkRuntimePermission(permissions, new RuntimePermissionListener() {
@Override
public void onRuntimePermissionGranted() {
//do something
}
@Override
public void onRuntimePermissionDenied() {
ToastUtil.show(MAinActivity.this, "拒绝该权限将无法使用部分功能");
}
});
}
3、如果在fragment中怎么用呢,那就在BaseFragment中:
/**
* 检查运行时权限
*
* @param permissions 所检查的权限数组
* @param runtimePermissionListener 运行时权限监听器
*/
public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
Activity activity = getActivity();
if (activity instanceof BaseActivity) {
((BaseActivity) activity).checkRuntimePermission(permissions, runtimePermissionListener);
}
}
使用方法和在activity中一样~
附上郭神视频录播地址:http://edu.csdn.net/course/detail/3539