一、在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); } } }