什么是android动态权限
android动态权限是google在android6.0中引入的一种在程序运行时请求的权限,动态一词就是用于区分6.0以前的静态获取权限的方式。6.0以前权限只在安装app时列明,同意安装即意味着同意授予权限。这有可能导致用户的隐私权受到侵犯。所以在6.0以后危险的权限一律需要通过请求允许后方能调用
动态权限的分类
系统权限分为两类:正常权限和危险权限:
- 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
- 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。
1.需要用户手动赋予的权限( Dangerous Permissions)
所属权限组 | 权限 |
---|---|
日历 | READ_CALENDAR;WRITE_CALENDAR |
相机 | CAMERA |
联系人 | READ_CONTACTS;WRITE_CONTACTS;GET_ACCOUNTS |
位置 | ACCESS_FINE_LOCATION; ACCESS_COARSE_LOCATION |
麦克风 | RECORD_AUDIO |
电话 | READ_PHONE_STATE;CALL_PHONE;READ_CALL_LOG;WRITE_CALL_LOG;WRITE_CALL_LOG;ADD_VOICEMAIL; USE_SIP;PROCESS_OUTGOING_CALLS |
传感器 | BODY_SENSORS |
短信 | SEND_SMS;RECEIVE_SMS;READ_SMS;RECEIVE_WAP_PUSH;RECEIVE_MMS |
存储 | READ_EXTERNAL_STORAGE;WRITE_EXTERNAL_STORAGE |
权限申请关键代码
/**
* 判断用户是否拥有该权限
* @param permission 申请的权限
* @return
*/
private boolean hasPermission(String permission) {
int result = PermissionChecker.checkSelfPermission(context, permission);
if (result != PermissionChecker.PERMISSION_GRANTED) {
return false;
}
return true;
}
/**
* 获取是否点击了不再询问按钮,只在androidM生效,动态权限是android6.0以上需求
* @param permissionName
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.M)
private boolean isNeverAsk(@NonNull String permissionName) {
return ((Activity)context).shouldShowRequestPermissionRationale(permissionName);
}
/**
* 动态请求权限 系统会弹个框
*
* @param permissions 待用户授权的权限集
*/
private void requestPermission(String[] permissions) {
ActivityCompat.requestPermissions(this, permissions, REQ_CODE);
}
参考资料
https://developer.android.google.cn/guide/topics/security/permissions