在Android6.0后有些权限就需要进行询问,虽然可以将targetSdkVersion设置成小于等于23,但是这样可能有些东西无法使用,所以要进行权限的管理。

实现逻辑:打开页面就询问权限,如果没有权限就出现系统提示框,如果拒绝则弹出自定义警告框,左边是设置跳到系统的权限的界面,右边是结束当前的页面。

AndroidManifest.xml

  1. <!--危险权限-->
  2. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  4.  
  5. <!--一般权限-->
  6. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
  1. MainActivity.java
  1. package com.kkrs.permission;
  2.  
  3. import android.Manifest;
  4. import android.content.Intent;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.os.Bundle;
  7.  
  8. public class MainActivity extends AppCompatActivity {
  9.  
  10. private static final int REQUEST_CODE = 0; // 请求码
  11.  
  12. // 所需的全部权限
  13. static final String[] PERMISSIONS = new String[]{
  14. Manifest.permission.RECORD_AUDIO,
  15. Manifest.permission.MODIFY_AUDIO_SETTINGS,
  16. Manifest.permission.WRITE_EXTERNAL_STORAGE
  17. };
  18.  
  19. private PermissionsChecker mPermissionsChecker; // 权限检测器
  20.  
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25.  
  26. mPermissionsChecker = new PermissionsChecker(this);
  27. }
  28.  
  29. @Override protected void onResume() {
  30. super.onResume();
  31.  
  32. // 缺少权限时, 进入权限配置页面
  33. if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
  34. startPermissionsActivity();
  35. }
  36. }
  37.  
  38. private void startPermissionsActivity() {
  39. PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
  40. }
  41.  
  42. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  43. super.onActivityResult(requestCode, resultCode, data);
  44. // 拒绝时, 关闭页面, 缺少主要权限, 无法运行
  45. if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
  46. finish();
  47. }
  48. }
  49. }
  1. PermissionsChecker.java
  1. package com.kkrs.permission;
  2.  
  3. import android.content.Context;
  4. import android.content.pm.PackageManager;
  5. import android.support.v4.content.ContextCompat;
  6.  
  7. /**
  8. * Created by zd on 2018/12/10.
  9. */
  10.  
  11. public class PermissionsChecker {
  12. private final Context mContext;
  13.  
  14. public PermissionsChecker(Context context) {
  15. mContext = context.getApplicationContext();
  16. }
  17.  
  18. // 判断权限集合
  19. public boolean lacksPermissions(String... permissions) {
  20. for (String permission : permissions) {
  21. if (lacksPermission(permission)) {
  22. return true;
  23. }
  24. }
  25.  
  26. return false;
  27. }
  28.  
  29. // 判断是否缺少权限
  30. private boolean lacksPermission(String permission) {
  31. return ContextCompat.checkSelfPermission(mContext, permission) ==
  32. PackageManager.PERMISSION_DENIED;
  33. }
  34. }
  1. PermissionsActivity.java
  1. package com.kkrs.permission;
  2.  
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.DialogInterface;
  6. import android.content.Intent;
  7. import android.content.pm.PackageManager;
  8. import android.net.Uri;
  9. import android.os.Bundle;
  10. import android.provider.Settings;
  11. import android.support.annotation.NonNull;
  12. import android.support.annotation.Nullable;
  13. import android.support.v4.app.ActivityCompat;
  14. import android.support.v7.app.AppCompatActivity;
  15.  
  16. /**
  17. * Created by zd on 2018/12/10.
  18. */
  19.  
  20. public class PermissionsActivity extends AppCompatActivity {
  21. public static final int PERMISSIONS_GRANTED = 0; // 权限授权
  22. public static final int PERMISSIONS_DENIED = 1; // 权限拒绝
  23.  
  24. private static final int PERMISSION_REQUEST_CODE = 0; // 系统权限管理页面的参数
  25. private static final String EXTRA_PERMISSIONS =
  26. "com.kkrs.permission.permission.extra_permission"; // 权限参数
  27. private static final String PACKAGE_URL_SCHEME = "package:"; // 方案
  28.  
  29. private PermissionsChecker mChecker; // 权限检测器
  30. private boolean isRequireCheck; // 是否需要系统权限检测
  31.  
  32. // 启动当前权限页面的公开接口
  33. public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {
  34. Intent intent = new Intent(activity, PermissionsActivity.class);
  35. intent.putExtra(EXTRA_PERMISSIONS, permissions);
  36. ActivityCompat.startActivityForResult(activity, intent, requestCode, null);
  37. }
  38.  
  39. @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
  40. super.onCreate(savedInstanceState);
  41. if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {
  42. throw new RuntimeException("PermissionsActivity需要使用静态startActivityForResult方法启动!");
  43. }
  44. setContentView(R.layout.activity_permissions);
  45. mChecker = new PermissionsChecker(this);
  46. isRequireCheck = true;
  47. }
  48.  
  49. @Override protected void onResume() {
  50. super.onResume();
  51. if (isRequireCheck) {
  52. String[] permissions = getPermissions();
  53. if (mChecker.lacksPermissions(permissions)) {
  54. requestPermissions(permissions); // 请求权限
  55. } else {
  56. allPermissionsGranted(); // 全部权限都已获取
  57. }
  58. } else {
  59. isRequireCheck = true;
  60. }
  61. }
  62.  
  63. // 返回传递的权限参数
  64. private String[] getPermissions() {
  65. return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
  66. }
  67.  
  68. // 请求权限兼容低版本
  69. private void requestPermissions(String... permissions) {
  70. ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
  71. }
  72.  
  73. // 全部权限均已获取
  74. private void allPermissionsGranted() {
  75. setResult(PERMISSIONS_GRANTED);
  76. finish();
  77. }
  78.  
  79. /**
  80. * 用户权限处理,
  81. * 如果全部获取, 则直接过.
  82. * 如果权限缺失, 则提示Dialog.
  83. *
  84. * @param requestCode 请求码
  85. * @param permissions 权限
  86. * @param grantResults 结果
  87. */
  88. @Override
  89. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  90. if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
  91. isRequireCheck = true;
  92. allPermissionsGranted();
  93. } else {
  94. isRequireCheck = false;
  95. showMissingPermissionDialog();
  96. }
  97. }
  98.  
  99. // 含有全部的权限
  100. private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
  101. for (int grantResult : grantResults) {
  102. if (grantResult == PackageManager.PERMISSION_DENIED) {
  103. return false;
  104. }
  105. }
  106. return true;
  107. }
  108.  
  109. // 显示缺失权限提示
  110. private void showMissingPermissionDialog() {
  111. AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
  112. builder.setTitle("权限标题");
  113. builder.setMessage("需要权限的内容");
  114.  
  115. // 拒绝, 退出应用
  116. builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
  117. @Override public void onClick(DialogInterface dialog, int which) {
  118. setResult(PERMISSIONS_DENIED);
  119. finish();
  120. }
  121. });
  122.  
  123. builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
  124. @Override public void onClick(DialogInterface dialog, int which) {
  125. startAppSettings();
  126. }
  127. });
  128.  
  129. builder.show();
  130. }
  131.  
  132. // 启动应用的设置
  133. private void startAppSettings() {
  134. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  135. intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
  136. startActivity(intent);
  137. }
  138. }

效果

android 自定义权限管理的更多相关文章

  1. 大约Android 了解权限管理

    如Android应用程序开发人员.为android权限机制一直觉得很奇怪.为什么要这个东西权限?为什么要AndroidManifest里面写的uses-permission 这样的事情?我一直搞不清楚 ...

  2. DRF内置权限组件之自定义权限管理类

    DRF内置权限组件permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问. 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object( ...

  3. Android 开发 权限管理

    Android 开发 权限管理 https://sspai.com/post/42779 $ adb shell pm list permissions -d -g https://zhuanlan. ...

  4. Android自定义权限和使用权限

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 自定义权限,主要用于保护被赋予权限的组件.如无权限与有权限,正如public与private的对类保 ...

  5. [Android Pro] android 4.4 Android原生权限管理:AppOps

    reference : http://m.blog.csdn.net/blog/langzxz/45308199 reference : http://blog.csdn.net/hyhyl1990/ ...

  6. Android自定义权限

    一.自定义权限 自定义权限,一般是考虑到应用共享组件时的安全问题.我们知道在四大组件 AndroidManifest 中注册的时候,添加 exported = "true" 这一属 ...

  7. android sdcard 权限管理策略研究

    自从android4.4 以来,第三方应用程序是不能再随便的访问sdcard了,从开发者的角度而言,研究一下android系统到底是怎么样来实现这样的控制还是比较有价值的. 首先分析下现状,现在已知, ...

  8. Android 自定义权限 (<permission> <uses-permission>)

    在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作.如果应用需要执行某些操作,就需要声明使用这个操作对应的权限. (在manifest ...

  9. Android自定义权限与使用

    1. 如何自定义权限 Android允许我们使用permission标签,在Manifest文件中定义属于自己的权限,一个例子如下, <?xml version="1.0" ...

随机推荐

  1. .NET之JSON序列化运用

    1.项目引用NuGet包:搜索:Newtonsoft.Json 2.序列号实例 using System; using System.Collections.Generic; using System ...

  2. nginx常用配置系列-静态资源处理

    接上篇,nginx处理静态资源的能力很强,后端服务器其实也可以处理静态资源,比如tomcat,但把非业务类的单一数据交给后端处理显然效率比较低,还有一种场景是多个站点公用一套资源集时,通过nginx可 ...

  3. PAT1002:A+B for Polynomials

    1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...

  4. kvm常见故障及解决

    一.启动虚拟机Connection reset by peer # virsh start vmhost1error: Failed to start domain vmhost1error: Una ...

  5. 主成分分析PCA详解

    转载请声明出处:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识 ...

  6. java中Number类理解

    一般我们使用数字的时候,会使用内置的数据类型,比如int.float.double.但在实际的开发当中,我们有时候会遇到需要使用数字对象,而不是数据类型的时候.为解决这个问题,java为每一种数据类型 ...

  7. float之脱离文档流

    所谓的文档流:指的是元素在排版过程中,元素自动从左到右,从上到下的顺序排列. 脱离文档流:也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位 只有绝对定位 ...

  8. SSM-Spring-14:Spring中默认自动代理DefaultAdvisorAutoProxyCreator

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 默认自动代理DefaultAdvisorAutoProxyCreator 本处没有什么要讲的,放原代码 ISo ...

  9. js实现html截图生成图片

      没有华丽的开场,直入主题,这就是题主随笔风格.随笔既是日常工作积累,也可理解是个工作笔记,方便日后用到之处快速的有方可寻.   先讲一个需求场景: 定制网页截图传给服务器端保存,用户关注公众号后自 ...

  10. 17.app后端如何保证通讯安全--aes对称加密

    在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详 ...