以申请Camera权限为例
工具类:
public class PermissionRequest {
public static final int CAMERA_PERMISSION_REQUEST_CODE = 3;
Activity activity;
public PermissionRequest(Activity activity) {
this.activity = activity;
}
public void requestPermissionForCamera(){
//第一次申请权限被拒后每次进入activity就会调用,或者用户之前允许了,之后又在设置中去掉了该权限
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
Toast.makeText(activity, "Camera permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);
}
}
public boolean checkPermissionForCamera(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
}
调用者:
工具类初始化
PermissionRequest pm_request = new PermissionRequest(this);
在onCreate或者onResume申请权限
/**
* 动态检查摄像头权限
*/
if (!pm_request.checkPermissionForCamera()) {
pm_request.requestPermissionForCamera();
} else {
//有权限的步骤
}
重写回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
Log.v("chj", "onRequestPermissionsResult ");
switch (requestCode) {
case PermissionRequest.CAMERA_PERMISSION_REQUEST_CODE:
Log.v("chj","CAMERA_PERMISSION_REQUEST_CODE ");
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.v("chj","PERMISSION_GRANTED");
//申请成功 用户同意的处理代码
mDecodeLibrary.startCameraPreview();
} else {
//用户拒绝或者直接返回了
}
return;
}
}
详细介绍:鸿洋大神的博客
http://blog.csdn.net/lmj623565791/article/details/50709663