Android 6.0新权限系统权限管理

一、在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之前的版本上回崩溃,因为之前的版本没有checkSelfPermissionrequestPermissions,因此我们需要检测设备版本,

根据设备做不同的操作:

简单的方法:

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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36071384/article/details/77895763