最近使用android6.0开发项目,碰到权限问题,android6.0(api23)以后google为了用户安全,对权限机制做了改变,我觉得有必要总结下, android的权限分两种,一种是普通权限(Normal Permissions),一种是敏感权限(Dangerous Permissions),
1.普通权限如下:
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
< uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.TRANSMIT_IR"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<!-- CAMERA 相机拍照组 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- CONTACTS 联系人组 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- LOCATION 定位组 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- MICROPHONE 麦克风组 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- PHONE 组 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- SENSORS 传感器组 -->
<uses-permission android:name="android.permission.BODY_SENSORS" />
<!-- SMS 组 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<!-- STORAGE 存储组 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android 6.0之前,需要使用到相关权限只要在AndroidManifest.xml 里面注册即可,但是6.0以上版本对于敏感权限需要动态获取,即对于6.0以上系统,把需要权限放在AndroidManifest.xml 已经没用了,需要在代码里面获取,好苦逼,如获取<uses-permission android:name="android.permission.READ_PHONE_STATE" />权限,代码如下:
private void checkPermission()
{
if (Build.VERSION.SDK_INT >= 23) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE},REQUEST_CODE_ASK_CALL_PHONE);
return;
}else{
//do something
}
} else {
//do something
}
}
上面代码会弹出一个dialog,供用户授权,用户可以选择允许,或者拒绝,然后会有callback:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_CALL_PHONE:
if(permissions == null || permissions.length <=0)
break;
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//do something
} else {
//get permission fail
Toast.makeText(this, "CALL_PHONE Denied", Toast.LENGTH_SHORT)show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
在grantResults[0] == PackageManager.PERMISSION_GRANTED处为用户允许使用该权限,然后就可以做想做的事。
只要用户授权了权限组里面的任意子权限,其他子权限也自动授权。