您的位置:首页 > 移动开发 > Android开发

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.申请权限:

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: