http://blog.csdn.net/longkehuawei/article/details/53202804

第一步:检测所有的权限是否都已授权

  1. /**
  2. * 检测所有的权限是否都已授权
  3. *
  4. * @param permissions
  5. * @return
  6. */
  7. private boolean checkPermissions(String[] permissions) {
  8. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  9. return true;
  10. }
  11. for (String permission : permissions) {
  12. if (ContextCompat.checkSelfPermission(this, permission) !=
  13. PackageManager.PERMISSION_GRANTED) {
  14. return false;
  15. }
  16. }
  17. return true;
  18. }

第二步:获取权限集中需要申请权限的列表

  1. /**
  2. * 获取权限集中需要申请权限的列表
  3. *
  4. * @param permissions
  5. * @return
  6. */
  7. private List<String> getDeniedPermissions(String[] permissions) {
  8. List<String> needRequestPermissionList = new ArrayList<>();
  9. for (String permission : permissions) {
  10. if (ContextCompat.checkSelfPermission(this, permission) !=
  11. PackageManager.PERMISSION_GRANTED ||
  12. ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
  13. needRequestPermissionList.add(permission);
  14. }
  15. }
  16. return needRequestPermissionList;
  17. }

第三步:请求权限

  1. /**
  2. * 请求权限
  3. *
  4. * @param permissions 请求的权限
  5. * @param requestCode 请求权限的请求码
  6. */
  7. public void requestPermission(String[] permissions, int requestCode) {
  8. this.REQUEST_CODE_PERMISSION = requestCode;
  9. if (checkPermissions(permissions)) {
  10. permissionSuccess(REQUEST_CODE_PERMISSION);
  11. } else {
  12. List<String> needPermissions = getDeniedPermissions(permissions);
  13. ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]), REQUEST_CODE_PERMISSION);
  14. }
  15. }

第四步:处理权限请求回调

  1. /**
  2. * 系统请求权限回调
  3. *
  4. * @param requestCode
  5. * @param permissions
  6. * @param grantResults
  7. */
  8. @Override
  9. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  10. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  11. if (requestCode == REQUEST_CODE_PERMISSION) {
  12. if (verifyPermissions(grantResults)) {
  13. permissionSuccess(REQUEST_CODE_PERMISSION);
  14. } else {
  15. permissionFail(REQUEST_CODE_PERMISSION);
  16. showTipsDialog();
  17. }
  18. }
  19. }

第五步:查看处理权限请求回调用户是否已经授权

  1. /**
  2. * 确认所有的权限是否都已授权
  3. *
  4. * @param grantResults
  5. * @return
  6. */
  7. private boolean verifyPermissions(int[] grantResults) {
  8. for (int grantResult : grantResults) {
  9. if (grantResult != PackageManager.PERMISSION_GRANTED) {
  10. return false;
  11. }
  12. }
  13. return true;
  14. }

第六步:授权成功处理函数

  1. /**
  2. * 获取权限成功
  3. *
  4. * @param requestCode
  5. */
  6. public void permissionSuccess(int requestCode) {
  7. Log.d(TAG, "获取权限成功=" + requestCode);
  8. }

第七步:授权失败处理函数与弹出用户提示

  1. /**
  2. * 权限获取失败
  3. * @param requestCode
  4. */
  5. public void permissionFail(int requestCode) {
  6. Log.d(TAG, "获取权限失败=" + requestCode);
  7. }
  8. /**
  9. * 显示提示对话框
  10. */
  11. private void showTipsDialog() {
  12. new AlertDialog.Builder(this)
  13. .setTitle("提示信息")
  14. .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")
  15. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  16. @Override
  17. public void onClick(DialogInterface dialog, int which) {
  18. }
  19. })
  20. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  21. @Override
  22. public void onClick(DialogInterface dialog, int which) {
  23. startAppSettings();
  24. }
  25. }).show();
  26. }

第八步:授权失败给用户提示后想再次开启跳到设置app权限界面

  1. /**
  2. * 启动当前应用设置页面
  3. */
  4. private void startAppSettings() {
  5. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  6. intent.setData(Uri.parse("package:" + getPackageName()));
  7. startActivity(intent);
    }

封装一个MPermissionsActivity的思路和步骤的更多相关文章

  1. IOS中封装一个View的思路

    一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...

  2. 使用xib封装一个自定义view的步骤

    使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...

  3. Vue + Element-ui实现后台管理系统(4)---封装一个ECharts组件的一点思路

    封装一个ECharts组件的一点思路 有关后台管理系统之前写过三遍博客,看这篇之前最好先看下这三篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system ...

  4. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  5. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  6. 自己封装一个Log模块

    Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...

  7. 简易封装一个带有占位文字的TextView

    在实际iOS应用开发中我们经常会用到类似于下图所示的界面,即带有占位文字的文本框:

  8. iOS开发之自己封装一个progressHUD控件

    看了几个轻量级的progress view 我觉得KVNProgress做的最漂亮吧 突然我想为什么我自己不封装一个控件 然后我研究了一下KVNProgress KVN简单的界面是由storyboar ...

  9. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

随机推荐

  1. 剑指offer——面试题22:链表中倒数第k个节点

    注意代码的鲁棒性! 函数: ListNode* TheLastKthNode(ListNode* pHead,int k) { ) return nullptr; ListNode* quickNod ...

  2. http-https php文件下载

    http: function httpDownload($url, $path = '', $filename = '', $timeout = 60,$type = 0) { if ($url == ...

  3. SpringBoot 整合 ActiveMq

    消息队列,用来处理开发中的高并发问题,通过线程池.多线程高效的处理并发任务. 首先,需要下载一个ActiveMQ的管理端:我本地的版本是 activemq5.15.8,打开activemq5.15.8 ...

  4. 浅解bootstrap 下拉框插件

    最近的业务需求是把后台数据渲染到前端,其中有一个是复选框数组,前端选择渲染的方式是bootstrap的下拉插件 渲染完成之后,此时会在原有select同级上面生成buton,dropdown-menu ...

  5. Jmeter性能测试之添加思考时间

    利用定时器添加用户思考时间 JMeter如何插入思考时间,在一个真实的性能测试场景中,是需要加入思考时间,来模拟真实用户行为.本文就来介绍,如何在三个请求之间添加思考时间. 1. 在Test Plan ...

  6. Loadrunner—关联知识点

    一.关联定义 把脚本中某些写死的数据,转变成是撷取自服务器所发送的.动态的.每次都不一样的数据 二.什么时候需要做关联 要想弄清这个问题,我们首先要知道客户端与服务器端的请求与响应的过程 过程说明: ...

  7. LinuxShell脚本编程7-for和while

    1.for的使用 #! /bin/bash ` do echo $a done 表示:a初始值为1,然后a=a+2的操作,一直到a<=10为止 for((i=1;i<=10;i=i+2)) ...

  8. 资料汇总--Web前端

    01.前端技能汇总 02.gitHub优秀前端资料分享 03.大前端 HTML Doctype作用?严格模式与混杂模式如何区分?它们有何意义? 1. <!DOCTYPE> 声明位于文档中的 ...

  9. C#语言-05.委托和事件

    a. 委托:是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联.所谓兼容的方法,是指这个方法和委托的方法签名具有相同的返回类型和参数 i. 语法:delegate 方法签名; . 方法签名是方 ...

  10. Lucene学习之四:Lucene的索引文件格式(1)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html Lucene的索引里面存了些什么,如何存放的,也即 ...