Android 6.0新权限系统权限管理
2017-09-08 15:54
253 查看
一、在Android6.0后,Android的权限系统进行了全新的升级。
新的权限系统再我们设置targetSDKVersion=23及以上时生效,如果我们设置的是小于23的,则仍然使用之前的权限系统。
新版的权限申请仍然有俩种:
第一种:和23之前的权限系统相同,仍然是在AndroidManifest.xml清单文件中进行申请这些权限分别是
android.permission.ACCESS LOCATIONEXTRA_COMMANDS
android.permission.ACCESS NETWORKSTATE
android.permission.ACCESS NOTIFICATIONPOLICY
android.permission.ACCESS WIFISTATE
android.permission.ACCESS WIMAXSTATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE NETWORKSTATE
android.permission.CHANGE WIFIMULTICAST_STATE
android.permission.CHANGE WIFISTATE
android.permission.CHANGE WIMAXSTATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND STATUSBAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET PACKAGESIZE
android.permission.INTERNET
android.permission.KILL BACKGROUNDPROCESSES
android.permission.MODIFY AUDIOSETTINGS
android.permission.NFC
android.permission.READ SYNCSETTINGS
android.permission.READ SYNCSTATS
android.permission.RECEIVE BOOTCOMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST INSTALLPACKAGES
android.permission.SET TIMEZONE
android.permission.SET_WALLPAPER
android.permission.SET WALLPAPERHINTS
android.permission.SUBSCRIBED FEEDSREAD
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE SYNCSETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
第二种:
就是关系到用户隐私的权限:
android.permission.CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
android.permission.CAMERA(相机)
CAMERA
android.permission.CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
android.permission.LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
android.permission.MICROPHONE(麦克风)
RECORD_AUDIO
android.permission.PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
android.permission.SENSORS(传感器)
BODY_SENSORS
android.permission.SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
android.permission.STORAGE(存储卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
此类权限,在请求的一组内的仍一种权限,就默认获取了改组的所有权限。
二、以打电话为例进行权限的申请:
1.申请权限:
2.取得申请结果:
三、以上代码存在一个问题就是运行在6.0之前的版本上回崩溃,因为之前的版本没有checkSelfPermission和requestPermissions,因此我们需要检测设备版本,
根据设备做不同的操作:
简单的方法:
if(Build.VERSION.SDK_INT >= 23){
//6.0之后的操作
} else {
//6.0之前的操作
}
当然还可以通过v4包提供的方法来解决:
示例
获取权限返回处理
新的权限系统再我们设置targetSDKVersion=23及以上时生效,如果我们设置的是小于23的,则仍然使用之前的权限系统。
新版的权限申请仍然有俩种:
第一种:和23之前的权限系统相同,仍然是在AndroidManifest.xml清单文件中进行申请这些权限分别是
android.permission.ACCESS LOCATIONEXTRA_COMMANDS
android.permission.ACCESS NETWORKSTATE
android.permission.ACCESS NOTIFICATIONPOLICY
android.permission.ACCESS WIFISTATE
android.permission.ACCESS WIMAXSTATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE NETWORKSTATE
android.permission.CHANGE WIFIMULTICAST_STATE
android.permission.CHANGE WIFISTATE
android.permission.CHANGE WIMAXSTATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND STATUSBAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET PACKAGESIZE
android.permission.INTERNET
android.permission.KILL BACKGROUNDPROCESSES
android.permission.MODIFY AUDIOSETTINGS
android.permission.NFC
android.permission.READ SYNCSETTINGS
android.permission.READ SYNCSTATS
android.permission.RECEIVE BOOTCOMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST INSTALLPACKAGES
android.permission.SET TIMEZONE
android.permission.SET_WALLPAPER
android.permission.SET WALLPAPERHINTS
android.permission.SUBSCRIBED FEEDSREAD
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE SYNCSETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
第二种:
就是关系到用户隐私的权限:
android.permission.CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
android.permission.CAMERA(相机)
CAMERA
android.permission.CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
android.permission.LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
android.permission.MICROPHONE(麦克风)
RECORD_AUDIO
android.permission.PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
android.permission.SENSORS(传感器)
BODY_SENSORS
android.permission.SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
android.permission.STORAGE(存储卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
此类权限,在请求的一组内的仍一种权限,就默认获取了改组的所有权限。
二、以打电话为例进行权限的申请:
1.申请权限:
private void callphoto() { //检查是否拥有权限 int i = checkSelfPermission(Manifest.permission.CALL_PHONE); if(i!= PackageManager.PERMISSION_GRANTED){ //当没有权限是调用 requestPermissions(new String[]{Manifest.permission.CALL_PHONE},1);//参数1是需要的权限可以同时请求多个权限,参数2是返回值 return; } //如果有权限直接打电话 Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+"13000000000")); startActivity(intent); }
2.取得申请结果:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==1){ //权限请求成功 Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+"13000000000")); startActivity(intent); }else { //权限拒绝 TODO something } super.onActivityResult(requestCode, resultCode, data); }
三、以上代码存在一个问题就是运行在6.0之前的版本上回崩溃,因为之前的版本没有checkSelfPermission和requestPermissions,因此我们需要检测设备版本,
根据设备做不同的操作:
简单的方法:
if(Build.VERSION.SDK_INT >= 23){
//6.0之后的操作
} else {
//6.0之前的操作
}
当然还可以通过v4包提供的方法来解决:
ContextCompat.checkSelfPermission
ActivityCompat.requestPermissions
onRequestPermissionsResult
示例
private void callphoto2() {
int i =ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);
if (i != PackageManager.PERMISSION_GRANTED) {
//如果没有权限这申请授权
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
return;
}
//如果有权限直接打电话
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "13000000000"));
startActivity(intent);
}
获取权限返回处理
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { //权限请求成功,对于23以下的grantResults[0] = -1; if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + "13000000000")); startActivity(intent); } } }
相关文章推荐
- Android 启动系统相机,相册,裁剪图片及6.0权限管理
- Android拍照及图片裁剪、调用系统相册(兼容6.0以上权限处理及7.0以上文件管理)
- Android 6.0 - 动态权限管理的解决方案
- android:targetSdkVersion的不同影响6.0系统下权限的获取方式
- Android 6.0 权限管理 实例
- Android 6.0运行时权限管理
- 你或许理解错了Android系统权限管理的这两个概念
- Android 6.0: 动态权限管理的解决方案
- Android权限管理之RxPermission解决Android 6.0 适配问题
- Android学习之6.0系统运行时权限设置
- Android 6.0 以下系统的权限检测
- Android 6.0 应用权限(二) -- 与系统权限一起工作(Working with System Permissions) 使用MarkDown重新整理了排版
- Android 6.0 应用权限(二) -- 与系统权限一起工作(Working with System Permissions)
- Android权限管理之RxPermission解决Android 6.0 适配问题
- 谈谈Android 6.0 的动态权限管理
- Android 6.0权限管理解决方案
- Android 6.0 权限管理(permission)
- Android 6.0 运行时权限管理
- Android 6.0权限管理的解析与实战
- Android开发之深入理解Android 6.0、7.0系统权限