Android 动态权限
从 Android 6.0 (API 23)开始使用动态的权限及(targetSdkVersion >=23 就需要动态的申请权限),使得系统更加安全,用户的信息也得到了更好的保护。
在android 6.0 中权限被分为两种:
- Normal Permissions (正常权限)
- Dangerous Permissions(危险权限)
其中危险权限又进行了分类,把所有的危险权限分为了九组。正常的权限是不需要动态的申请的,只有危险权限才需要动态的申请。
所有的危险权限:
权限组 | 权限 |
---|---|
CALENDAR | 日历 |
CAMERA | 相机 |
CONTACTS | 联系人 |
LOCATION | 定位 |
MICROPHONE | 麦克,录音 |
PHONE | 手机状态 |
SENSORS | 传感器 |
SMS | 短信 |
STORAGE | 存储权限 |
Anroid 6.0 中权限问题中需要注意的两点
- 由于权限API问题,我们的 Activity 最好是 AppCompatActivity 类型的,也就是说在你的 BaseActivity 需要继承 AppCompatActivity。
- 权限是分组的,同一组的权限申请其中一个,同组的权限就全部都申请了。当然,不论是正常权限还是危险权限都必须在应用的 Manifest.xml 中声明。
使用开源的 EasyPermissions 进行动态的申请
easypermission.pngGitHub 地址: EasyPermissions 这个项目是GoogleSamples
-
配置
在 app 层的 build.gradle 中dependencies { compile 'pub.devrel:easypermissions:0.4.2' }
-
使用
举栗子
在Activity(Fragment)中都可以使用private void checkPermissions() { //每一次在需要使用到权限的时候都要进行检查权限是否开启,虽然之前是开启的,但是用户有可能关闭权限 //这里是需要申请的权限 String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}; if(EasyPermissions.hasPermissions(this,perms)){ //权限已经申请完成,执行任务 choosePhoto(); }else{ EasyPermissions.requestPermissions(this,"需要访问你的相册",RC_WRITE_READ_EXTERNAL_STORAGE,perms); //RC_WRITE_READ_EXTERNAL_STORAGE 是requestCode } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { if (EasyPermissions.somePermissionPermanentlyDenied(this,perms)){ new AppSettingsDialog.Builder(this).build().show(); } } //如果选择了,取消权限,再次检查时会进入onActivityResult @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode){ case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE: Toast.makeText(this,"您需要开启访问相册的权限才能选择图片,请进入设置中开启访问权限",Toast.LENGTH_SHORT).show(); break; } }
网友评论