前言

最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时权限--默认所有涉及用户隐私的权限都被关闭,我们在AndroidManifest.xml中申请了,之后我们还得动态申请权限,不然我们每次安装完APP后,就得在“设置=》应用=》安装的APP”打开我们所需权限。

Android 6.0 需要动态申请的权限

Android M引入了运行时权限。所有权限仍然需要在AndroidManifest中声明。但是,当访问需要权限的API时,活动或片段必须验证权限已被授予或使用通过支持库的调用请求缺少的权限。Android 6.0需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。如下所示:

group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA permission:android.permission.CAMERAgroup:android.permission-group.SENSORS permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS

Android 6.0动态权限申请主要方法

Android6.0动态权限申请主要用到v4包中的下面三个函数:

权限通过ActivityCompat类中的checkselfpermission方法。

权限请求是通过Activitycompat 类中的requestpermissions方法,在回调activitycompat收到响应。onrequestpermissionsresultcallback # onrequestpermissionsresult方法。

应用程序可以提供一个额外的合理的使用权限调用Activitycompat #shouldshowrequestpermissionrationale方法。Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。然而,在实际开发中,需要注意的是,很多手机对原生系统做了修改,比如小米,小米4的6.0的shouldShowRequestPermissionRationale 就一直返回false,而且在申请权限时,如果用户选择了拒绝,则不会再弹出对话框了。。。。 所以说这个地方有坑,我的解决方法是,在回调里面处理,如果用户拒绝了这个权限,则打开本应用信息界面,由用户自己手动开启这个权限。

Android 6.0动态权限申请示例

上面讲了Android6.0动态权限申请的原理,下面我们来看一下如何申请动态权限。

1、首先在AndroidManifest.xml文件中申请所需要的权限。比如我要申请照相机的权限

2、在build.gradle文件中修改targetSdkVersion即APP所支持的sdk版本号大于等于23,我这里设置为23.因为23就是Android 6.0的sdk版本号。

3、开始申请权限,我们通过流程图来看一下

代码示例:

检查权限

//检查权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //进入到这里代表没有权限. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);} else { showcamera();}

我们还需要写回掉方法:

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case REQUEST_CODE: if(grantResults.length >0 &&grantResults[0]==PackageManager.PERMISSION_GRANTED){ //用户同意授权 showcamera(); }else{ //用户拒绝授权 } break; }}

如果拒绝提示用户我们用上面的方法,如果申请时用户拒绝授予权限时,APP会崩溃,所以我们需要在用户拒绝授予权限后,提示用户我们为什么要这个权限。

//检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //进入到这里代表没有权限. if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){ //已经禁止提示了 Toast.makeText(MainActivity.this, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show(); }else{ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE); }

android 6.0权限库,Android 6.0动态权限适配相关推荐

  1. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  2. Android 自带图标库 android.R.drawable

    在xml文件中调用. android:title="@string/secure_connect" android:orderInCategory="100" ...

  3. android 沉浸式开源库,Android沉浸式状态栏

    关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...

  4. Android 获取Wifi列表详解(包含动态权限申请)

    WLAN 扫描流程 扫描流程分为三步: 为 SCAN_RESULTS_AVAILABLE_ACTION 注册一个广播监听器,系统会在完成扫描请求时调用此监听器,提供其成功/失败状态.对于搭载 Andr ...

  5. android旋转动画开源库,android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  6. android实现qq表情库,Android编程开发之EditText实现输入QQ表情图像的方法

    本文实例讲述了Android编程开发之EditText实现输入QQ表情图像的方法.分享给大家供大家参考,具体如下: 实现效果如下: 将QQ表情图像放到res下的drawable-hdpi文件夹下: 布 ...

  7. android多媒体编程题库,android 仿猿题库答题UI

    需要做类似猿题库答题板效果,网上没有找到Android的,就自己写一个,浮层上滑底层UI跟着改变的UI public class DragLinearLayoutextends LinearLayou ...

  8. android仿微信图片编辑库,Android仿微信图片选择器

    很多项目要用到图片选择控件,每次都要写一大堆逻辑.于是基于图片选择组件(PhotoPicker)封装了一个控件PhotoUploadView.方便简易,一键集成,几句代码就可以添加类似微信的图片选择控 ...

  9. android cpp做成so库,Android增量更新(二)—制作合成文件so库

    ###前言 在上节中,我们已经学习了`Android增量更新`的实现原理,那么在Android开发的移动端,我们需要涉及到的其实是`文件合成`的这个流程. 那么,今天就来讲讲增量更新合成流程的实现吧. ...

最新文章

  1. 如何完全安装mysql数据库_数据库经验:如何简单安装MySQL数据库
  2. VirtFS 虚拟化技术简介
  3. 基于OpenCV进行相机标定
  4. jodd-cache集锦
  5. 4 种大学生兼职,助你走向经济独立!
  6. 排序 八种经典排序算法
  7. 导致出现404的原因以及解决方案
  8. sap委外采购订单冲销 102_SAP那些事-实战篇-68-谈谈SAP的库存设计理念
  9. visio能做动态原理图_单、双节锂电池2x20W动态升压双声道音频功放组合方案
  10. 58-最小乘积(基本型)
  11. MySQL保存历史执行语句
  12. keil ISIS AT89C51单片机
  13. ideaIU-2020.1.3的安装
  14. 微信小程序-tab切换(scroll-view + swiper)
  15. 同余方程组,中国剩余定理,孙子定理(学习)
  16. CSDN日报190221——被裁的第50天,我终于拿到心仪公司Offer
  17. requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  18. 小木虫 高光谱遥感图像处理_高光谱图像变化检测
  19. Spark抽取MySQL分表优化
  20. 用友-应收应付重分类公式设置

热门文章

  1. 前端零基础教学开始第一天 01 -day
  2. 杠上Spark、Flink?Kafka为何转型流数据平台
  3. LVS的DR模式配置
  4. zabbix 监控CDN带宽
  5. fstream,sstream,使用(习题8.16)
  6. [C++再学习系列] 引用和指针
  7. javascript与jQuery对照学习总结(一)(一些常规操作)
  8. SpringBoot启动类的扫描注解的用法及冲突原则
  9. Kraken2 物种序列比对 注释
  10. 爬取jd商城手机类商品图片