6.0运行时权限

来源:互联网 发布:linux虚拟机安装教程 编辑:程序博客网 时间:2024/06/10 17:30

涉及到的代码在这里

流程图

先看下权限申请流程图吧

Created with Raphaël 2.1.0StartSdk int >=23检查是否已被授权自己的业务逻辑End 是否能展示使用权限的理由展示理由,继续进行?请求权限,是否被授权提示用户在设置中打开相机权限yesnoyesnoyesnoyesnoyesnoyesno

效果图

 这里写图片描述

介绍


从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;用户可以随时进入应用的“Settings”屏幕调用权限。

权限


权限分类

系统权限分为两类:正常权限和危险权限,无论是哪一种都必须在清单文件中列出来。

  • 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
     

  • 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。

权限组

任何权限都有一个所属的权限组,包括正常权限和应用定义的权限。仅当使用危险权限时才影响用户体验,在不同版本上的表现在下面会有详细说明。可以忽略正常权限的权限组。

权限列表

  • 正常权限

    ACCESS_LOCATION_EXTRA_COMMANDS
    ACCESS_NETWORK_STATE
    ACCESS_NOTIFICATION_POLICY
    ACCESS_WIFI_STATE
    BLUETOOTH
    BLUETOOTH_ADMIN
    BROADCAST_STICKY
    CHANGE_NETWORK_STATE
    CHANGE_WIFI_MULTICAST_STATE
    CHANGE_WIFI_STATE
    DISABLE_KEYGUARD
    EXPAND_STATUS_BAR
    GET_PACKAGE_SIZE
    INSTALL_SHORTCUT
    INTERNET
    KILL_BACKGROUND_PROCESSES
    MODIFY_AUDIO_SETTINGS
    NFC
    READ_SYNC_SETTINGS
    READ_SYNC_STATS
    RECEIVE_BOOT_COMPLETED
    REORDER_TASKS
    REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
    REQUEST_INSTALL_PACKAGES
    SET_ALARM
    SET_TIME_ZONE
    SET_WALLPAPER
    SET_WALLPAPER_HINTS
    TRANSMIT_IR
    UNINSTALL_SHORTCUT
    USE_FINGERPRINT
    VIBRATE
    WAKE_LOCK
    WRITE_SYNC_SETTINGS

  • 危险权限与权限组

    可以通过如下命令来查看

    adb shell pm list permissions -d -g

Dangerous Permissions://group:android.permission-group.CONTACTS  permission:android.permission.WRITE_CONTACTS  permission:android.permission.GET_ACCOUNTS  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  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  permission:android.permission.ACCESS_COARSE_LOCATION//group:android.permission-group.STORAGE  permission:android.permission.READ_EXTERNAL_STORAGE  permission:android.permission.WRITE_EXTERNAL_STORAGE//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  permission:android.permission.RECEIVE_MMS  permission:android.permission.RECEIVE_SMS  permission:android.permission.SEND_SMS  permission:android.permission.READ_CELL_BROADCASTS

危险权限在不同版本上的表现


系统只告诉用户应用需要的权限组,而不告知具体权限。
 

  • Android 5.1 或更低版本,或者应用的目标 SDK 为 22 或更低:
    如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限,否则系统根本不会安装应用。

  • Android 6.0 或更高版本,或者应用的目标 SDK 为 23或更高:

    • 应用必须在清单中列出权限,并且它必须在运行时请求其需要的危险权限,如果没有申请权限而直接使用相应功能则会出现下面的异常堆栈。用户可以授予或拒绝每项权限,如果用户拒绝权限请求,则不能使用相应功能。
    • 请求危险权限时,如果应用目前在所属权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求 READ_CONTACTS 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
    • 如果应用在所属权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 READ_CONTACTS 权限,然后它又请求 WRITE_CONTACTS,系统将立即授予该权限。

异常堆栈


E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.org.bigmaning.runtimepermission, PID: 4361
java.lang.RuntimeException: Unable to start activity

with revoked permission android.permission.CAMERA

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE cmp=com.android.camera/.Camera }

with revoked permission android.permission.CAMERA

申请权限


相关方法

  • 检查相应权限是否被授权
    checkSelfPermission(String permissionName)
    • PackageManager.PERMISSION_GRANTED   授权
    • PackageManager.PERMISSION_DENIED    拒绝
  • 是否要展示请求权限的理由
    shouldShowRequestPermissionRationale(String permissionName)
    • false
      • 此前应用没有请求过此权限,第一请求权限时
      • 此前用户拒绝了此权限并选中了不再询问
    • true
      • 此前用户拒绝了此权限但没有勾选不再询问
  • 请求权限
    requestPermissions(String[] permissions, int requestCode)
  • 请求结果回调
    onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults)

效果 


结合上面的例子,主要演示拒绝授权的情况。

  1. 应用首次申请照相机权限
. 表现 Android系统提示框 标准 shouldShowRequestPermissionRationale false

.
模拟用户点击拒绝

这里写图片描述
2. 第二次申请权限 

. 表现 Android系统提示框 标准+不再询问 shouldShowRequestPermissionRationale true

.
还是模拟用户点击拒绝(不勾选 不再提示)

这里写图片描述
3. 第三次申请权限

. 表现 Android系统提示框 标准+不再询问 shouldShowRequestPermissionRationale true

.
还是模拟用户点击拒绝(勾选 不再提示)
这里写图片描述
4. 第四次申请权限

. 表现 Android系统提示框 不会出现 shouldShowRequestPermissionRationale false

.
因为第三次的表现,此时系统会直接拒绝这个权限,并回调onRequestPermissionsResult()。

这里写图片描述

总结 


  • 运行时权限的申请流程还是很简单的,这里简单说下shouldShowRequestPermissionRationale(…) ,这个方法仅当为true时,可以向用户解释为什么需要这个权限,增加授权的机会。根据同学们的业务要求,决定用不用这个功能。
  • 在onRequestPermissionsResult回调中,如果用户拒绝了权限,应该提示用户到设置里手动开启相应权限。

Github上star最多的实用工具


  1. PermissionsDispatcher
  2. RxPermissions
  3. easypermissions
  4. Dexter
  5. AndPermission
0 0
原创粉丝点击