2019独角兽企业重金招聘Python工程师标准>>>

Android 6.0起权限管理更严格了,朝着IOS权限靠拢了。看来Android也慢慢朝着封闭的方向发展了。如果 targetSdkVersion <23,就没有动态权限问题,但这不是长久之计,迟早要适配的。

Android将权限分为3种:

  • 普通权限(Normal Permissions)
  • 危险权限(Dangerous Permissions)
  • 特殊权限(Special Permissions)

如果 targetSdkVersion>=23 那么就要对 危险权限和 特殊权限动态申请

危险权限(Dangerous Permissions)

Permission Group Permissions
CALENDAR READ_CALENDAR <br/>WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS <br/>WRITE_CONTACTS <br/>GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION <br/>ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE<br/> CALL_PHONE <br/>READ_CALL_LOG <br/>WRITE_CALL_LOG <br/>ADD_VOICEMAIL USE_SIP <br/>PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS <br/>RECEIVE_SMS <br/>READ_SMS<br/> RECEIVE_WAP<br/>_PUSH RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE<br/> WRITE_EXTERNAL_STORAGE

危险权限基本都涉及到用户的隐私,Android系统将这些危险权限分为9组,

获取分组中某个权限的同时也就获取了同组中的其他权限

危险权限不仅需要在 AndroidManifest.xml中注册,还需要动态的申请权限

EasyPermisson 是Google对动态权限申请的封装,Google出品必属精品;

添加依赖

dependencies {compile 'pub.devrel:easypermissions:0.2.1'
}

AndroidManifest添加权限

<manifest>
<uses-permission android:name="android.permission.CAMERA" />
</manifest>

添加实现(以相机权限为例子)

public class MainActivity extends AppCompatActivity implements  EasyPermissions.PermissionCallbacks{private static final String TAG="tag";private static final int CAMERA_PERM = 0x100;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);grantCamera();}private void openCamera(){}@AfterPermissionGranted(CAMERA_PERM)private void grantCamera() {if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)) {//有此权限openCamera();} else {//没有此权限,需要重新申请EasyPermissions.requestPermissions(this, "请求camera权限", CAMERA_PERM, Manifest.permission.CAMERA);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}@Overridepublic void onPermissionsGranted(int requestCode, List<String> perms) {Log.d(TAG,"success");}@Overridepublic void onPermissionsDenied(int requestCode, List<String> perms) {if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {new AppSettingsDialog.Builder(this, "点击确定去设置界面设置权限").setTitle("Title").setPositiveButton("确定").setNegativeButton("取消", null /* click listener */).setRequestCode(requestCode).build().show();}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == CAMERA_PERM) {//从设置权限界面返回if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)){}}}
}

@AfterPermissionGranted(CAMERA_PERM)注解是在用户同意授权后EasyPermissions再次回调注解的函数;AppSettingsDialog 是googgle封装的直接跳转到设置权限界面dialog;

特殊权限(Special Permissions)

Special Permissions
SYSTEM_ALERT_WINDOW 设置悬浮窗
WRITE_SETTINGS 修改系统设置

特殊权限比危险权限更危险,特殊权限需要在manifest中申请并且通过发送Intent让用户在设置界面进行勾选.


public class MainActivity extends AppCompatActivity implements  EasyPermissions.PermissionCallbacks{private static final int SYSTEM_ALERT_WINDOW_PERM = 0x101;private static final int WRITE_SETTINGS_PERM = 0x102;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);grantAlertWindow();grantWriteSettings();}private void grantAlertWindow(){Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);intent.setData(Uri.parse("package:" + getPackageName()));startActivityForResult(intent, SYSTEM_ALERT_WINDOW_PERM);}private void grantWriteSettings(){Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);intent.setData(Uri.parse("package:" + getPackageName()));startActivityForResult(intent, WRITE_SETTINGS_PERM );}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == SYSTEM_ALERT_WINDOW_PERM) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if ( Settings.canDrawOverlays(this)){//get}}}else if (requestCode == WRITE_SETTINGS_PERM) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (Settings.System.canWrite(this)) {//get}}}}
}

转载于:https://my.oschina.net/yale8848/blog/829996

EasyPermisson 动态权限使用例子相关推荐

  1. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

  2. delphi android动态权限,DELPHI安卓动态权限申请

    DELPHI安卓动态权限申请 安卓8.0以前的版本,只需要给静态权限就可以了,但安卓8.0及以后的版本,还需要运行期用代码动态申请权限. 下面以<蓝牙权限>为例,其他权限类似. Delph ...

  3. android权限适配 简书,Android动态权限适配

    最近APP里面要添加动态权限,网上找了不少例子并经过一定的测试,基本流程有了一定的认识,需要注意的地方记录下来以备以后查阅. 一 各大手机厂商的适配 依据各大手机Rom的不同表现,可以分为三种不同的模 ...

  4. 二维码的扫描与生成(含动态权限)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat cjm2484836553的博客 RSS订阅 原 Androi ...

  5. 最容易理解的Android6.0动态权限申请教程

    1.前言 这已经是N年前的知识点了,但是我一直以来都有点逃避学习这个,而且印象中很麻烦,后来也不间断有学习过一点,但是一直没认真去用过,所以对这个android6.0的动态权限申请一直是不清楚的状态, ...

  6. SpringBoot 整合 Shiro 实现动态权限加载更新+ Session 共享 + 单点登录

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源: juejin.im/post/5d087d60518825 ...

  7. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

  8. Android动态权限管理模型(4.3-6.0)

    Google从4.3开始就试图引入AppOpsManager动态权限管理模型,但是,由于感觉技术不太成熟,在Release版本中,这个功能都是被隐藏掉的,所以官方Rom一直没有动态权限管理机制.直到A ...

  9. Spring Boot 2.6之后,动态权限控制终于可以用起来了!

    Spring Security 5.6 发布有些时间了.随着Spring Boot 2.6的发布Spring Security 5.6终于有机会上生产了.在Spring Security 5.6中动态 ...

最新文章

  1. python自学步骤-怎么自学python,大概要多久?
  2. Hadoop 2.x的DistributedCache无法工作的问题
  3. python通讯录综合_Python通讯录作业
  4. 可应用于实际的14个NLP突破性研究成果(一)
  5. 海南大学计算机原理,海南大学微机原理课件 第一章 计算机基础知识
  6. python全栈面试题_python面试题大全(一)
  7. SmartDrv的前世今生——PrimoCache_2.2.0汉化
  8. java hdporn,docs/java/concurrent/SynBottom.md · wt1814/wt-note - Gitee.com
  9. 有向图和无向图转化为邻接表后链表中结点个数
  10. 详解手机注册验证码操作思路与流程
  11. golang dep安装
  12. pgsql装数卸数方案
  13. 文件下载图片或者视频及解决保存文件时中文乱码问题
  14. Illustrator插件开发之ADM列表
  15. 二维码下载,区分是 ios 和 android
  16. 不用微博SDK,直接使用 新浪微博 分享链接进行分享
  17. UDP单播 组播 广播 区别及简单实现
  18. html绝对定位到相邻元素中间,css – 在另一个元素的中心下方水平居中绝对定位元素...
  19. PMP培训是否有官方授权机构报名?
  20. list在python里是什么意思_python中的list是什么意思

热门文章

  1. -Xlint:deprecation
  2. 黑马程序员-代理类的作用与原理及AOP
  3. div+css经典三行两列布局
  4. 中兴路西藏北路到浦东国际机场路线(ddmap20100114)
  5. 关于code footprint-reduction-techniques
  6. 微软:SolarWinds 供应链攻击事件幕后黑手攻击全球24国政府
  7. DDoS booter滥用 DTLS 服务器放大攻击
  8. 比特币里面有哪些天才的设计?
  9. jQuery实现Ajax
  10. php中常用的字符串获取函数mb_strcut实例解释