在Android6.0出来之前,大家基本都是在清淡配置文件中间添加系统权限。但在Android6.0之后很多权限需要动态获取。如拍Sd卡的写入,写出、震动,等等。
这里为大家简单的介绍一下如何进行动态权限的获取,以及如何编写动态权限封装类。
这里以获取本地相机拍照为例。
一共两步,1、创建动态权限获取类。2、调用。
1、先创建一个动态权限的封装类PermissionTool.class
,已方便在其他类里面使用(不建议写在Acticity里面)
public class PermissionTool { private Context context;
final public static int REQUEST_CODE_ASK_CAMERA = 125;//相机权限 final public static int REQUEST_CODE_ASK_PHOTOS = 126;//相册权限 public PermissionTool(Context context) { this.context = context; }
//动态获取相机权限 public boolean onCamera(){
if (Build.VERSION.SDK_INT >= 23) { int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
//注意这里是用于判断app是否以获取到了相应的权限,若没有。则申请获取。其中REQUEST_CODE_ASK_CAMERA相当于识别码,用于告诉Activity动态获取了相机权限,方便在Activity的onRequestPermissionsResult回调方法
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.CAMERA},REQUEST_CODE_ASK_CAMERA); return false; }else{ //上面已经写好的拨号方法 return true; } } else { //上面已经写好的拨号方法 return true; }}//动态获取相册权限public boolean onPhotos(){ if (Build.VERSION.SDK_INT >= 23) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE); if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE_ASK_PHOTOS); return false; }else{ return true; } } else { return true; } }
}
2、接下来就是调用
直接在需要的地方调用
PermissionTool permissionTool=new PermissionTool(this);
if(permissionTool.onCamera()){
//如果返回是true说明已有权限直接写你的逻辑代码
//如果返回是false,这时候Activity会在用户动态赋予app权限之后自动调用onRequestPermissionsResult()这个方法
}
//动态权限获取返回 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) {//根据requestCode判断获取的是哪个权限,以便进行相应的处理 case REQUEST_CODE_ASK_PHOTOS://相册权限以获取 break; case REQUEST_CODE_ASK_CAMERA://相机权限以获取 break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
BUT:
部分情况下可能会出现即使使用了onRequestPermissionsResult()之后,但在用户动态给了权限之后没用运行改方法
此时我们只需要让Activity继承ActivityCompat.OnRequestPermissionsResultCallback这个接口。