为了用户权限的更好的控制,保护好用户的隐私,android在API23上面开始使用了动态全选的设置,对于这个引起的问题呢
1.如果你给你的App配置的targetSdkVersion设置的低于23的话,app会认为你没有在android6上进行测试,所以在app安装的时候会把所有的权限给列出来,然后"强迫"用户默认所有权限授权进行安装,(不受授权,不安装)
2,如果用户在设置中关闭权限的话会导致你的应用没有权限开启不了对应的功能,然后对应的操作也就会返回null或者0,然后后果的话你也就知道了。。。。
3.你的targetSdkVersion设置的不低于23,那么对于一些涉及隐私的你就要去动态的添加,我们先来看下权限的分类吧:
权限2大分类
PROTECTION_NORMAL权限 ,应用安装的时候授权(这些权限的话都是不涉及隐私的。用户也是不能关闭的)都有:
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
Dangerous Permissions: 设计隐私的权限,需要你去动态申请的
| |
Permission Group | Permissions |
---|---|
android.permission-group.CALENDAR |
|
android.permission-group.CAMERA |
|
android.permission-group.CONTACTS |
|
android.permission-group.LOCATION |
|
android.permission-group.MICROPHONE |
|
android.permission-group.PHONE |
|
android.permission-group.SENSORS |
|
android.permission-group.SMS |
|
android.permission-group.STORAGE |
|
首先你可能会有惊讶,为啥这个还分组了,其实这也是大google方便我们,只要你申请了一组里面的任一个权限,他会将相关的权限附带给你授权了,比如你申请了位置权限loaction中的ACCESS_FINE_LOCATION ,那么对应的该loaction 的ACCESS_COARSE_LOCATION权限你也会被授权了(只要你在manifest中有注册了)(不过如果你是个谨慎的人的话,还是老老实实的对每一个权限去申请,因为你指不定这个分组会变,毕竟 everything is possible)
相关的google的api文段
http://developer.android.com/training/permissions/requesting.html
http://developer.android.com/guide/topics/security/permissions.html
如何去申请权限
1. 配置权限 和以前一样,先都是在manifest中配置好需要的所有的权限
2.检查权限是否获取到 使用
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
}else{ }//需要申请授权了
注:ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS),判断权限是否授权,返回的值是PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了
3申请授权代码
ActivityCompat.requestPermissions(activty,new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
CODE_FOR_WRITE_PERMISSION);
参数的话第一个 Context,第二个是授权的权限数组,第三个是requestCode,主要用于回调的时候检测。第二个参数的话传多个权限的话,就会弹出多个授权的对话框 , ⚠️ 这里面的弹出对话框是不能进行定制的,是由各个手机去定制的比如gengenymotion上面的框是![](https://img-blog.csdn.net/20161122152846100)
4.不用说接下来就是对弹出框的两个按钮的选择监听了
@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}GitHub上的封装
你可以在github上面搜索到android permission就可以找到 很多的相关库,你选一个就OK了,这里就不做啰嗦了,(其实也就是懒癌有犯了)
<a href=""http://blog.csdn.net/lmj623565791/article/details/50709663">http://blog.csdn.net/lmj623565791/article/details/50709663
出自鸿洋之手了