1. 6.0的权限怎么了?
以前 : 安装了app后,发现app经常访问我们的通讯录等等隐私信息,没有经过我们同意,怎么可以呢?
6.0: 安装app后,如果想访问通讯录这类隐私, 会弹出对话框提示,需要我们的同意,可以点击确定或者取消,是不是有了权利,否决很多危险的权限。
当然如果不想遇到运行权限的问题, 只需要将targetSdkVersion设置低于23就可以了
2. 危险权限有那些?那些是安全的呢?
adb查危险权限: adb shell pm list permissions -d -g
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
**分组: ** 从上面的权限看到,是分组哦,如果以前组员获得了我们的同意,同组的其他权限不会在通知我们了哦.
**3 . Sample : **
下面看看6.0的权限,代码中怎么管理呢?(以前都是 知道的,直接AndroidManifest.xml中
例子:小米5设备的6.0版本
加入拍照的危险权限
直接运行时,报错:
解决:
1: checkSelfPermission方法对camera的权限去检查是否已经授权,如果没有去申请
//去申请权限
if(ContextCompat.checkSelfPermission(mActivity.getApplicationContext()
, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){//PERMISSION_GRANTED允许
ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA_TAG);
}else{
//已经授权了
startCamera();
}
2: 如果没有去申请ActivityCompat.requestPermissions去申请
ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA_TAG);
app开启时提示:
3: 点击了也许或者拒绝,要回调给我们结果,直接在activity或者fragment中重写方法
/**
* 权限申请的回调
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//允许的情况
if(requestCode == PERMISSION_CAMERA_TAG){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
startCamera();
}else{
Toast.makeText(mActivity, "Permission denied", Toast.LENGTH_SHORT).show();
}
}
}
6.0的运行时权限,我们最终都是要支持的,通常我们需要使用如下的API
* int checkSelfPermission(String permission) 用来检测应用是否已经具有权限
* void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限
* void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用户对请求作出响应后的回调
这样就结束了吗? 上面是一个权限的申请,假如多个危险权限的申请呢?
因为多个在权限申请时是固定的步骤,大量的重复代码,固定的流程,所以就会考虑封装。下一篇研究一下封装哦,加油!