新建的Activity类可以继承这个Activity,这个类封装了关于新版的权限处理相关的代码

使用方法:

  1. package com.glsite.phone;
  2. import android.content.DialogInterface;
  3. import android.content.pm.PackageManager;
  4. import android.os.Build;
  5. import android.support.annotation.NonNull;
  6. import android.support.v4.app.ActivityCompat;
  7. import android.support.v7.app.AlertDialog;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.widget.Toast;
  10. /**
  11. * @author Admin
  12. * @version $Rev$
  13. * @des ${TODO}
  14. * @updateAuthor $Author$
  15. * @updateDes ${TODO}
  16. */
  17. public class BaseActivity extends AppCompatActivity {
  18. //**************** Android M Permission (Android 6.0权限控制代码封装)
  19. private int permissionRequestCode = 88;
  20. private PermissionCallback permissionRunnable;
  21. public interface PermissionCallback {
  22. void hasPermission();
  23. void noPermission();
  24. }
  25. /**
  26. * Android M运行时权限请求封装
  27. *
  28. * @param permissionDes 权限描述
  29. * @param runnable 请求权限回调
  30. * @param permissions 请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS
  31. */
  32. public void performCodeWithPermission(@NonNull String permissionDes, PermissionCallback runnable, @NonNull String... permissions) {
  33. if (permissions == null || permissions.length == 0)
  34. return;
  35. // this.permissionrequestCode = requestCode;
  36. this.permissionRunnable = runnable;
  37. if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.M) || checkPermissionGranted(permissions)) {
  38. if (permissionRunnable != null) {
  39. permissionRunnable.hasPermission();
  40. permissionRunnable = null;
  41. }
  42. } else {
  43. //permission has not been granted.
  44. requestPermission(permissionDes, permissionRequestCode, permissions);
  45. }
  46. }
  47. private boolean checkPermissionGranted(String[] permissions) {
  48. boolean flag = true;
  49. for (String p : permissions) {
  50. if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {
  51. flag = false;
  52. break;
  53. }
  54. }
  55. return flag;
  56. }
  57. private void requestPermission(String permissionDes, final int requestCode, final String[] permissions) {
  58. if (shouldShowRequestPermissionRationale(permissions)) {
  59. /*1. 第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale() 返回 true,应该显示一些为什么需要这个权限的说明
  60. 2.第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale() 返回 false
  61. 3. 设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale() 返回 false*/
  62. // Provide an additional rationale to the user if the permission was not granted
  63. // and the user would benefit from additional context for the use of the permission.
  64. // For example, if the request has been denied previously.
  65. // Snackbar.make(getWindow().getDecorView(), requestName,
  66. // Snackbar.LENGTH_INDEFINITE)
  67. // .setAction(R.string.common_ok, new View.OnClickListener() {
  68. // @Override
  69. // public void onClick(View view) {
  70. // ActivityCompat.requestPermissions(BaseAppCompatActivity.this,
  71. // permissions,
  72. // requestCode);
  73. // }
  74. // })
  75. // .show();
  76. //如果用户之前拒绝过此权限,再提示一次准备授权相关权限
  77. new AlertDialog.Builder(this)
  78. .setTitle("提示")
  79. .setMessage(permissionDes)
  80. .setPositiveButton("授权", new DialogInterface.OnClickListener() {
  81. @Override
  82. public void onClick(DialogInterface dialog, int which) {
  83. ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
  84. }
  85. }).show();
  86. } else {
  87. // Contact permissions have not been granted yet. Request them directly.
  88. ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
  89. }
  90. }
  91. private boolean shouldShowRequestPermissionRationale(String[] permissions) {
  92. boolean flag = false;
  93. for (String p : permissions) {
  94. if (ActivityCompat.shouldShowRequestPermissionRationale(this, p)) {
  95. flag = true;
  96. break;
  97. }
  98. }
  99. return flag;
  100. }
  101. /**
  102. * Callback received when a permissions request has been completed.
  103. */
  104. @Override
  105. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
  106. @NonNull int[] grantResults) {
  107. if (requestCode == permissionRequestCode) {
  108. if (verifyPermissions(grantResults)) {
  109. if (permissionRunnable != null) {
  110. permissionRunnable.hasPermission();
  111. permissionRunnable = null;
  112. }
  113. } else {
  114. Toast.makeText(this, "暂无权限执行相关操作!", Toast.LENGTH_SHORT).show();
  115. if (permissionRunnable != null) {
  116. permissionRunnable.noPermission();
  117. permissionRunnable = null;
  118. }
  119. }
  120. } else {
  121. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  122. }
  123. }
  124. public boolean verifyPermissions(int[] grantResults) {
  125. // At least one result must be checked.
  126. if (grantResults.length < 1) {
  127. return false;
  128. }
  129. // Verify that each required permission has been granted, otherwise return false.
  130. for (int result : grantResults) {
  131. if (result != PackageManager.PERMISSION_GRANTED) {
  132. return false;
  133. }
  134. }
  135. return true;
  136. }
  137. //********************** END Android M Permission ****************************************
  138. }

android:Android 6.0权限控制代码封装的更多相关文章

  1. Android开发——Android M(6.0) 权限解决方案

    Android开发--Android M(6.0) 权限解决方案 自从Android M(6.0)发布以来,权限管理相比以前有了很大的改变,很多程序员发现之前运行的好好的Android应用在Andro ...

  2. Android Capability 细粒度的权限控制

    1. 传统的UID/GID,权限颗粒度太大 2. Capability: 细粒度的权限控制 3. 进程的Capability 4. 文件的Capability 5. 进程的Capability Bou ...

  3. 【转】Android M(6.0) 权限爬坑之旅

    原文网址:https://yanlu.me/android-m6-0-permission-chasm/ 有一篇全面介绍Android M 运行时权限文章写的非常全面:Android M 新的运行时权 ...

  4. yii2.0权限控制 ACF权限

    ACF是一种通过yii\filters\AccessControl类来实现的简单授权 有两种角色 ?:未经认证的游客用户 @:已认证的用户 ACF可同过对角色设置权限控制访问 1)记得引入yii\fi ...

  5. Android M(6.0) 权限相关

    原文链接:http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ Android M 新的运行时权限开发者需要知道的一切   an ...

  6. Android M(6.0) 权限爬坑之旅

    坑一:用Android5.0编译的apk,在Android6.0上运行完全没有问题. 在Android6.0以上才需要在运行时请求权限,在旧Android版本上保留原有逻辑,安装时授予权限. 用旧版本 ...

  7. SpringSecurity 3.2入门(9)自定义权限控制代码实现

    1. 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性,我们的所有控制将在 ...

  8. Android 基础-2.0 拔打电话号码

    1.添加权限 在AndroidManifest.xml 添加打电话权限 <uses-permission android:name="android.permission.CALL_P ...

  9. asp.net权限控制的方式

    我们在使用asp.net开发Web程序的时候经常需要进行一些权限控制,如: 限制用户没有登陆就无法查看一些页面,又或者是说登陆之后如果不是管理员,或是没有响应的权限就无法进行相关的操作. 实现的方法有 ...

随机推荐

  1. babel 的简单使用

    之前在项目中使用.balelrc文件,但是一直不知道具体怎么使用,就知道可以将es6语法转码为es5语法. 今天就简单的做个例子,也算是记录一下困扰了好久的问题. 转码步骤: 首先在项目的目录中安装B ...

  2. 占位 LR

    占位 LR include: LR403

  3. 配置maven时,报JAVA_HOME错误

    其实原因很简单,是之前java的jdk配置不合规范! 一.我是win10系统. 二.我的java jdk放在D盘,环境变量里,JAVA_HOME是D:\Program Files\Java\jdk1. ...

  4. 测度论--长度是怎样炼成的[zz]

    http://www.58pic.com/newpic/27882296.html http://www.58pic.com/newpic/27893137.html http://699pic.co ...

  5. 动态规划(Dynamic Programming, DP)---- 最大连续子序列和

    动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...

  6. 【网站】网站不能在QQ,微信中访问,申诉办法

    使用这个网站申诉即可 https://appeal.anquan.org/

  7. 百度地图和echarts结合实例

    1.由echart对象(bmapChart)获取百度地图对象(bdMap),echart对象(bmapChart)适用于所有的echart的操作和接口,百度地图对象(bdMap)适用于百度地图的所有接 ...

  8. protel99se无法添加库的解决方法

    protel99se是很老也很实用的的一门电类专业需要用到的软件,开发时面向XP,对于win7来说存在一定的不兼容性,导致无法添加新的库,本经验为此介绍解决方法.最全,末尾解决win7 32bit 6 ...

  9. linux异常 - 无法分配内存

    解决方案: 删除虚拟机上不必要的东西 重启开虚拟机的电脑

  10. 一看就会一做就废系列:说说 RECOVER DATABASE(下)

    这里是:一看就会,一做就废系列 数据库演示版本为 19.3 (12.2.0.3) 该系列涉及恢复过程中使用的 个语句: 1. recover database 2. recover database ...