Runtime Permission是什么
Android开发中,如果需要使用相机,网络等需要授权的功能时候,需要在Manifest.xml事先进行声明,否则不能使用。Permission在Android6.0以前,是在用户安装应用时候进行权限确定,如不能去的用户许可,则不能进行安装。大部分情况下,用户在安装之前其实不能判断应用使用该权限是否妥当。
为了解决这个问题,从Android6.0开发引入了Runtime Permission的概念。取消在应用安装时候的权限确认,改为在应用执行过程中,第一次需要使用该功能的时候进行确认。这样用户就能明确知道应用需要授权的权限是合理。
如果要使应用支持Runtime Permission,需要将Target SDK 版本设置为23以上。
Target SDK设置为22以前的时候,还是和以前一样在安装前确认。
和Target SDK无关,Android6.0在应用安装后,可以随时取消授权。所以需要在应用使用该功能时候需要进行必要的权限检查,否则可能会出现异常。
Runtime Permission只有Android6.0以后版本才会生效,之前的版本,不管Target SDK设置成什么,都是在安装应用之前确认。
适用于Runtime Permission的功能。
READ_CALENDAR 日历信息读取
WRITE_CALENDAR 日历信息写入
CAMERA 相机
READ_CONTACTS 通讯录读取
WRITE_CONTACTS 通讯录卸乳
GET_ACCOUNTS 用户帐户获取
ACCESS_FINE_LOCATION 详细位置信息
ACCESS_COARSE_LOCATION 粗略位置信息
RECORD_AUDIO 录音,麦克风使用
READ_PHONE_STATE 电话状态获取
CALL_PHONE 拨打电话
READ_CALL_LOG 获取通话记录
WRITE_CALL_LOG 写入通话记录
ADD_VOICEMAIL 添加语音邮件
USE_SIP SIP 使用会话协议( Session Initiation Protocol)
PROCESS_OUTGOING_CALLS 允许应用程序监听、控制、取消呼出电话的权限
BODY_SENSORS 允许使用身体健康数据的权限
SEND_SMS 允许发送短信息
RECEIVE_SMS 允许收取短信息
READ_SMS 允许读取短信息
RECEIVE_WAP_PUSH WAP(Wireless Application Protocol)接收权限
RECEIVE_MMS MMS接收权限
READ_EXTERNAL_STORAGE 允许读取设备外部存储空间
WRITE_EXTERNAL_STORAGE 允许写入设备外部存储空间
尽量减少不必要的权限申请。
例如,需要Intent的电话拨打使用:
Uri phoneNumber = Uri.parse(“tel:0123456789″); Intent callIntent = new Intent(Intent.ACTION_CALL,phoneNumber); startActivity(callIntent);
不需要Intent的电话拨打使用:
Uri phoneNumber = Uri.parse(“tel:0123456789″); Intent callIntent = new Intent(Intent.ACTION_DIAL,phoneNumber); startActivity(callIntent);
开发应该遵循以下顺序。
1.是否获取了相应的Permission。
2.如果没有权限,请求获取Permission。
3.分别添加获取权限和拒绝允许权限时候的后续处理。
1.使用ContextCompat.checkSelfPermission()来确认权限是否获取。
返回值是int型。
获得许可返回PackageManager.PERMISSION_GRANTED。
没有获得许可返回PackageManager.PERMISSION_DENIED,
if (ContextCompat.checkSelfPermission(
this,android.Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED){
// 允许
}else{
// 拒绝
}
2.如果没有权限,请求获取Permission。
使用ActivityCompat.shouldShowRequestPermissionRationale()请求获取权限。
如果返回值是true,则用户拒绝请求授权。
如果返回值是false,则允许请求授权。
注意:请求的权限必须在AndroidManifest里声明。
if (ContextCompat.checkSelfPermission(
this,android.Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED){
// 允许
}else{
// 不允许,请求权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.CAMERA)) {
// 拒绝授权
} else {
// 允许请求,授权提示
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, 0);
}
}
3.分别添加获取权限和拒绝允许权限时候的后续处理。
重写授权回调函数onRequestPermissionsResult()。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 0: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 允许
}else{
// 拒绝
}
break;
}
}
}
Android6.0中Runtime Permission的引入,影响范围很广,如果应用中使用了需要授权的功能,还是急早应用的好。
除特别注明外,本站所有文章均为[果博]原创 » 转载请注明出处来自https://aiguor.com/notes/48.html
果博