android 6.0 对权限进行了严格的管理
新的权限策略讲权限分为两类,第一类是不涉及用户隐私的,只需要在Manifest中声明即可,比如网络、蓝牙、NFC等;第二类是涉及到用户隐私信息的,需要用户授权后才可使用,比如SD卡读写、联系人、短信读写等。
Normal Permissions
此类权限都是正常保护的权限,只需要在AndroidManifest.xml中简单声明这些权限即可,安装即授权,不需要每次使用时都检查权限,而且用户不能取消以上授权,除非用户卸载App。
- 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
Dangerous Permissions
所有危险的Android系统权限属于权限组,如果APP运行在Android 6.0 (API level 23)
或者更高级别的设备中,而且targetSdkVersion>=23
时,系统将会自动采用动态权限管理策略,如果你在涉及到特殊权限操作时没有做动态权限的申请将会导致App崩溃,因此你需要注意:
- 此类权限也必须在Manifest中申明,否则申请时不提使用用户,直接回调开发者权限被拒绝。
- 同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。例如,一旦
WRITE_CONTACTS
被授权了,App也有READ_CONTACTS
和GET_ACCOUNTS
了。 - 申请某一个权限的时候系统弹出的Dialog是对整个权限组的说明,而不是单个权限。例如我申请
READ_EXTERNAL_STORAGE
,系统会提示"允许xxx访问设备上的照片、媒体内容和文件吗?"
。
如果App运行在Android 5.1 (API level 22)
或者更低级别的设备中,或者targetSdkVersion<=22
时(此时设备可以是Android 6.0 (API level 23)
或者更高),在所有系统中仍将采用旧的权限管理策略,系统会要求用户在安装的时候授予权限。其次,系统就告诉用户App需要什么权限组,而不是个别的某个权限。
- CALENDAR(日历)
- READ_CALENDAR
- WRITE_CALENDAR
- CAMERA(相机)
- CAMERA
- CONTACTS(联系人)
- READ_CONTACTS
- WRITE_CONTACTS
- GET_ACCOUNTS
- LOCATION(位置)
- ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
- MICROPHONE(麦克风)
- RECORD_AUDIO
- PHONE(手机)
- READ_PHONE_STATE
- CALL_PHONE
- READ_CALL_LOG
- WRITE_CALL_LOG
- ADD_VOICEMAIL
- USE_SIP
- PROCESS_OUTGOING_CALLS
- SENSORS(传感器)
- BODY_SENSORS
- SMS(短信)
- SEND_SMS
- RECEIVE_SMS
- READ_SMS
- RECEIVE_WAP_PUSH
- RECEIVE_MMS
- STORAGE(存储卡)
- READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
关于运行时权限的一些建议
-
只请求你需要的权限,减少请求的次数,或用Intent来代替,让其他的应用来处理。
- 如果你使用Intent,你不需要设计界面,由第三方的应用来完成所有操作。比如打电话、选择图片等。
- 如果你请求权限,你可以完全控制用户体验,自己定义UI。但是用户也可以拒绝权限,就意味着你的应用不能执行这个特殊操作。
-
防止一次请求太多的权限或请求次数太多,用户可能对你的应用感到厌烦,在应用启动的时候,最好先请求应用必须的一些权限,非必须权限在使用的时候才请求,建议整理并按照上述分类管理自己的权限:
- 普通权限(Normal PNermissions):只需要在Androidmanifest.xml中声明相应的权限,安装即许可。
- 需要运行时申请的权限(Dangerous Permissions):
- 必要权限:最好在应用启动的时候,进行请求许可的一些权限(主要是应用中主要功能需要的权限)。
- 附带权限:不是应用主要功能需要的权限(如:选择图片时,需要读取SD卡权限)。
-
解释你的应用为什么需要这些权限:在你调用
requestPermissions()
之前,你为什么需要这个权限。- 例如,一个摄影的App可能需要使用定位服务,因为它需要用位置标记照片。一般的用户可能会不理解,他们会困惑为什么他们的App想要知道他的位置。所以在这种情况下,所以你需要在
requestpermissions()
之前告诉用户你为什么需要这个权限。
- 例如,一个摄影的App可能需要使用定位服务,因为它需要用位置标记照片。一般的用户可能会不理解,他们会困惑为什么他们的App想要知道他的位置。所以在这种情况下,所以你需要在
AndPermission特性
- 兼容国产手机的各种bug(小米、华为、魅族,以及各种…)。
- 支持链式调用,一句话申请权限,为你省去复杂的逻辑判断。
- 支持注解回调结果、支持Listener回调结果。
- (可选)支持Rationale,拒绝一次权限,再次申请时先征求用户同意,再打开授权对话框,避免用户勾选不再提示。
- (可选)就算用户勾选不再提示,并且拒绝权限后,AndPermission智能提示用户去设置中授权。
- Rationale对话框自定义,申请授权失败后打开设置的dialog,预置了MD风格dialog,开发者也可以自定义。
- 如果使用默认对话框,自动支持国际化。
- 支持
Activity
、android.support.v4.app.Fragment
、android.app.Fragment
。
几个重要的方法与常量解释
-
PackageManager中的两个常量:
- PackageManager.PERMISSION_DENIED:该权限是被拒绝的。
- PackageManager.PERMISSION_GRANTED:该权限是被授权的。
-
Activity中或者Fragment都会有以下几个方法:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
上述四个方法中,前三个方法在support-v4
的ActivityCompat
中都有,建议使用兼容库中的方法。最后一个方法是用户授权或者拒绝某个权限组时系统会回调Activity或者Fragment中的方法。