“来了解Android的权限. ”
安卓6.0之上需要动态申请权限,Google 官方的定义为下方
从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。
系统权限分为两类
- 正常权限不会给用户带去风险,在清单文件中直接生命就可以。系统会直接同意 、
- 危险权限需要用户手动给予权限
对于正常权限来说不用去动态申请,危险权限需要。下方为Android系统上所有的危险权限
下面来写一下Android原生的权限动态申请流程
- 1.获取权限申请情况
int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); // 权限需要事先在清单文件中声明
- 2.申请权限
int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); // 如果用户没有授予权限 if (permission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); } else { }
- 3.权限申请回调
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { } break; } }
有几下几点需要注意
- 申请权限如果用户选择don't ask again,那么无论你怎么提示,都不会再出现权限的提示框
- 权限申请不是一次申请日后都有效,因为用户可能在设置中对已经获得权限的应用禁止权限
- 权限申请对一个权限组内的权限通用,例如,假设你在应用列出了 READ_CONTACTS 和 WRITE_CONTACTS。如果你请求了READ_CONTACTS且用户允许了权限,那么,当你对WRITE_CONTACTS进行申请时,不会再出现提示框,而会直接允许。
- 当用户选择don't ask again,不会再出现提示框,第一条已经说过,这时总是会回调onRequestPermissionsResult并返回 denied。其后的所有类似操作都会回调onRequestPermissionsResult并返回 denied。