android 动态权限添加 ,你不得不学

来源:互联网 发布:阿里云字体图标 编辑:程序博客网 时间:2024/04/26 23:09

为了用户权限的更好的控制,保护好用户的隐私,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 GroupPermissionsandroid.permission-group.CALENDAR
    • android.permission.READ_CALENDAR
    • android.permission.WRITE_CALENDAR
    android.permission-group.CAMERA
    • android.permission.CAMERA
    android.permission-group.CONTACTS
    • android.permission.READ_CONTACTS
    • android.permission.WRITE_CONTACTS
    • android.permission.GET_ACCOUNTS
    android.permission-group.LOCATION
    • android.permission.ACCESS_FINE_LOCATION
    • android.permission.ACCESS_COARSE_LOCATION
    android.permission-group.MICROPHONE
    • android.permission.RECORD_AUDIO
    android.permission-group.PHONE
    • android.permission.READ_PHONE_STATE
    • android.permission.CALL_PHONE
    • android.permission.READ_CALL_LOG
    • android.permission.WRITE_CALL_LOG
    • com.android.voicemail.permission.ADD_VOICEMAIL
    • android.permission.USE_SIP
    • android.permission.PROCESS_OUTGOING_CALLS
    android.permission-group.SENSORS
    • android.permission.BODY_SENSORS
    android.permission-group.SMS
    • android.permission.SEND_SMS
    • android.permission.RECEIVE_SMS
    • android.permission.READ_SMS
    • android.permission.RECEIVE_WAP_PUSH
    • android.permission.RECEIVE_MMS
    • android.permission.READ_CELL_BROADCASTS
    android.permission-group.STORAGE
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_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上面的框是
    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

    出自鸿洋之手了


      介绍一个 很简单的 权限GitHub 上的 easypermissions  http://www.jianshu.com/p/2b3661928e66












    0 0
    原创粉丝点击