Android 6.0运行时权限管理

来源:互联网 发布:4g网络优化工程师分期 编辑:程序博客网 时间:2024/06/07 19:32

运行时权限管理 定义:

之前我们的App需要权限,只需在manifest中申明,用户安装后,一切申明的权限都可使用。

但是Android 6.0以后Android M把权限管理做了加强处理,除了需要在manifest申明,在使用到相关功能时,有些权限还需重新授权方可使用,所以就把这些需要重新授权方可使用的权限称之为运行时权限(Dangerous Permission)。而在manifest里申请后,可直接使用的权限为普通权限(Normal Permissions

需要使用运行时权限的条件:

设备运行的是 Android 6.0(API 级别 23),并且应用的 targetSdkVersion 是 23 或更高版本,就会使用运行时权限规则

Normal Permissions :

  • android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令

  • android.permission.ACCESS_NETWORK_STATE 获取网络信息状态,如当前的网络连接是否有效

  • android.permission.ACCESS_NOTIFICATION_POLICY

  • android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息

  • android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备

  • android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备

  • android.permission.BROADCAST_STICKY 允许一个程序广播常用intents

  • android.permission.CHANGE_NETWORK_STATE 改变网络状态如是否能联网

  • android.permission.CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态

  • android.permission.CHANGE_WIFI_STATE 允许程序改变Wi-Fi连接状态

  • android.permission.DISABLE_KEYGUARD 允许程序禁用键盘锁

  • android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序

  • android.permission.GET_PACKAGE_SIZE 允许一个程序获取任何package占用空间容量

  • android.permission.INTERNET 访问网络连接,可能产生GPRS流量

  • android.permission.KILL_BACKGROUND_PROCESSES 允许程序调用killBackgroundProcesses(String).方法结束后台进程

  • android.permission.MODIFY_AUDIO_SETTINGS 修改声音设置信息

  • android.permission.NFC 允许程序执行NFC近距离通讯操作,用于移动支持

  • android.permission.READ_SYNC_SETTINGS 读取同步设置,读取Google在线同步设置

  • android.permission.READ_SYNC_STATS 读取同步状态,获得Google在线同步状态

  • android.permission.RECEIVE_BOOT_COMPLETED 允许程序开机自动运行

  • android.permission.REORDER_TASKS 允许程序改变Z轴排列任务

  • com.android.alarm.permission.SET_ALARM 设置闹铃提醒

  • android.permission.SET_TIME_ZONE 设置系统时区

  • android.permission.SET_WALLPAPER 允许程序设置壁纸

  • android.permission.SET_WALLPAPER_HINTS 允许程序设置壁纸hits

  • android.permission.VIBRATE 允许振动

  • android.permission.WAKE_LOCK 允许程序在手机屏幕关闭后后台进程仍然运行

  • android.permission.WRITE_SYNC_SETTINGS 允许程序写入同步设置

Dangerous Permission:

  • group:android.permission-group.CONTACTS

    • permission : android.permission.WRITE_CONTACTS 写入联系人,但不可读取
    • permission : android.permission.GET_ACCOUNTS 访问GMail账户列表
    • permission : android.permission.READ_CONTACTS 允许应用访问联系人通讯录信息
  • group:android.permission-group.PHONE

    • permission : android.permission.READ_CALL_LOG
    • permission : android.permission.READ_PHONE_STATE 访问电话状态
    • permission : android.permission.CALL_PHONE 允许一个程序初始化一个电话拨号不需通过拨号 用户界面需要用户确认
    • permission : android.permission.WRITE_CALL_LOG
    • permission : android.permission.USE_SIP 允许程序使用SIP视频服务
    • permission : android.permission.PROCESS_OUTGOING_CALLS 允许程序监视,修改或放弃播出电话
    • permission:com.android.voicemail.permission.ADD_VOICEMAIL
  • group:android.permission-group.CALENDAR

    • permission : android.permission.READ_CALENDAR 允许程序读取用户的日程信息
    • permission : android.permission.WRITE_CALENDAR 写入日程,但不可读取
  • group:android.permission-group.CAMERA

    • permission : android.permission.CAMERA 请求访问使用照相设备
  • group:android.permission-group.SENSORS

    • permission : android.permission.BODY_SENSORS
  • group:android.permission-group.LOCATION

    • permission : android.permission.ACCESS_FINE_LOCATION 通过GPS芯片接收卫星的定位信息,定位精度达10米以内
    • permission : android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米
  • group:android.permission-group.STORAGE

    • permission : android.permission.READ_EXTERNAL_STORAGE
    • permission : android.permission.WRITE_EXTERNAL_STORAGE 允许程序写入外部存储,如SD卡上写文件
  • group:android.permission-group.MICROPHONE

    • permission : android.permission.RECORD_AUDIO 录制声音通过手机或耳机的麦克
  • group:android.permission-group.SMS

    • permission : android.permission.READ_SMS 允许程序读取短信息
    • permission : android.permission.RECEIVE_WAP_PUSH 接收WAP PUSH信息
    • permission : android.permission.RECEIVE_MMS 接收彩信
    • permission : android.permission.RECEIVE_SMS 接收短信
    • permission : android.permission.SEND_SMS 发送短信

总结:分组对权限机制的影响

如果app运行在android 6.0的机器上,如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。

demo:假如app对READ_CONTACTS已经授权了,当申请WRITE_CONTACTS权限时,系统会直接授权通过。

权限列表

Android 权限列表,可参照以下资料参考一,参考二,参考三


申请运行权限步骤:

  • AndroidManifest声明使用权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
  • 在使用时,判断是否为Android 6.0以上,返回false则不需要申请,返回true,则需要申请权限
     private boolean isMarshmallow() {        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;     }
  • 检查权限
        String permission = Manifest.permission.CALL_PHONE;        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {            //TODO 未授权        } else {            //TODO 已授权        }

ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED(代表此权限已允许)。

  • 申请权限
        String permission = Manifest.permission.CALL_PHONE;        int requestCode = 1;        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {            //申请授权            ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);        } else {            //直接执行操作        }

另外,在申请权限的时候,还需要注意一个函数:

        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {        } else {            ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);        }

shouldShowRequestPermissionRationale

如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false

  • 处理权限申请回调
    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        if (requestCode == this.requestCode) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {               // 权限申请成功,执行操作            } else {                // 权限申请失败                Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();            }            return;        }        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }

总结:网上也有很多已经封装好的关于申请权限的,可以参照以下网址内容
http://jcodecraeer.com/plus/list.php?tid=31&keyword=%C8%A8%CF%DE