在Android6.0(API-23)以上且 targetSdkVersion 是23时申请危险权限需要动态申请。
如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本则不需要申请权限。
危险权限包括
权限组 | 权限 |
---|---|
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 |
普通权限(只要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
运行时权限的几个基本方法
API | 作用 |
---|---|
checkSelfPermission() |
判断权限是否具有某项权限 |
requestPermissions() |
申请权限 |
onRequestPermissionsResult() |
申请权限回调方法 |
shouldShowRequestPermissionRationale() |
是否要提示用户申请该权限的缘由,该方法只有当用户第一次拒绝之后再请求时会返回true 如果用户勾选不再询问之后会返回false |
运行时权限实践
|
|
图例
第一次请求流程
第二次请求流程
第三次请求流程
流程表
序号 | 用户是否授予权限 | shouldShowRequestPermissionRationale() 返回 |
是否勾选“不再询问” |
---|---|---|---|
1 | 否 | false | - |
2 | 否 | true | 否 |
3 | 否 | true | 否 |
…………i | 否 | true | 是 |
i + 1 | -false | - | - |
EasyPermisions
运行时权限结合EasyPermisions使用。
EasyPermisions是谷歌开源的运行时权限封装库,使用时在BaseActivity和BaseFragment中加上就可以轻松使用运行时权限。
BaseActivity封装
|
|
BaseFragment封装
|
|
使用例子
|
|