1. import android.annotation.TargetApi;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.pm.PackageManager;
  5. import android.os.Build;
  6. import android.support.v4.content.ContextCompat;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.List;
  10.  
  11. /**
  12. * DESC 6.0 权限工具类
  13. * Created by douhaoqiang on 2017/2/27.
  14. */
  15. public class PermissionUtils {
  16. private static final String TAG = "PermissionUtils";
  17.  
  18. private static int mRequestCode = -1;
  19.  
  20. private static OnPermissionListener mOnPermissionListener;
  21.  
  22. /**
  23. * 权限请求回调
  24. */
  25. public interface OnPermissionListener {
  26.  
  27. //权限通过
  28. void onPermissionGranted();
  29.  
  30. //权限拒绝
  31. void onPermissionDenied();
  32.  
  33. }
  34.  
  35. /**
  36. * 调用请求响应的权限
  37. * @param context 上下文菜单 必须为Activity
  38. * @param requestCode 请求码
  39. * @param permissions 请求权限
  40. * @param listener 权限请求监听
  41. */
  42. @TargetApi(Build.VERSION_CODES.M)
  43. public static void requestPermissions(Context context, int requestCode
  44. , String[] permissions, OnPermissionListener listener) {
  45. if (context instanceof Activity) {
  46. mOnPermissionListener = listener;
  47. List<String> deniedPermissions = getDeniedPermissions(context, permissions);
  48. if (deniedPermissions.size() > 0) {
  49. mRequestCode = requestCode;
  50. ((Activity) context).requestPermissions(deniedPermissions
  51. .toArray(new String[deniedPermissions.size()]), requestCode);
  52.  
  53. } else {
  54. if (mOnPermissionListener != null)
  55. mOnPermissionListener.onPermissionGranted();
  56. }
  57. } else {
  58. throw new RuntimeException("Context must be an Activity");
  59. }
  60. }
  61.  
  62. /**
  63. * 获取请求权限中需要授权的权限
  64. */
  65. private static List<String> getDeniedPermissions(Context context, String... permissions) {
  66. List<String> deniedPermissions = new ArrayList<>();
  67. for (String permission : permissions) {
  68. if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) {
  69. deniedPermissions.add(permission);
  70. }
  71. }
  72. return deniedPermissions;
  73. }
  74.  
  75. /**
  76. * 请求权限结果,对应Activity中onRequestPermissionsResult()方法。
  77. */
  78. public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  79. if (mRequestCode != -1 && requestCode == mRequestCode) {
  80. if (mOnPermissionListener != null) {
  81. if (verifyPermissions(grantResults)) {
  82. mOnPermissionListener.onPermissionGranted();
  83. } else {
  84. mOnPermissionListener.onPermissionDenied();
  85. }
  86. }
  87. }
  88. }
  89.  
  90. /**
  91. * 验证所有权限是否都已经授权
  92. */
  93. private static boolean verifyPermissions(int[] grantResults) {
  94. for (int grantResult : grantResults) {
  95. if (grantResult != PackageManager.PERMISSION_GRANTED) {
  96. return false;
  97. }
  98. }
  99. return true;
  100. }
  101.  
  102. }

使用:

  1. public class SplashActivity extends Activity {
  2.  
  3. String[] permissions = {
  4. Manifest.permission.WRITE_EXTERNAL_STORAGE,
  5. Manifest.permission.ACCESS_FINE_LOCATION,
  6. Manifest.permission.ACCESS_COARSE_LOCATION,
  7. Manifest.permission.CAMERA,
  8. Manifest.permission.RECORD_AUDIO
  9.  
  10. };
  11.  
  12. @Override
  13. protected void onCreate(@Nullable Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  16. WindowManager.LayoutParams.FLAG_FULLSCREEN); //全屏
  17. setContentView(R.layout.activity_splash);
  18. requestPermissions();
  19.  
  20. }
  21.  
  22. public void requestPermissions() {
  23. PermissionUtil.requestPermissions(this, 1, permissions, new PermissionUtil.OnPermissionListener() {
  24.  
  25. @Override
  26. public void onPermissionGranted() {
  27. startActivity(new Intent(SplashActivity.this, MainActivity.class));
  28. finish();
  29. }
  30.  
  31. @Override
  32. public void onPermissionDenied() {
  33. finish();
  34. }
  35. });
  36. }
  37.  
  38. @Override
  39. public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  40. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  41. PermissionUtil.onRequestPermissionsResult(requestCode, permissions, grantResults);
  42. }
  43.  
  44. //隐藏虚拟导航栏按键
  45. @Override
  46. public void onWindowFocusChanged(boolean hasFocus) {
  47. super.onWindowFocusChanged(hasFocus);
  48. if (hasFocus) {
  49. getWindow().getDecorView().setSystemUiVisibility(
  50. View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
  51. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
  52. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN
  53. );
  54. }
  55. }
  56.  
  57. }

PermissionUtils的更多相关文章

  1. Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

    Android PermissionUtils:运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6 Permis ...

  2. Android6.0动态权限申请

    goggle在Android6.0要求部分权限需要动态申请,直接下载AndroidManifest.xml中无效 6.0权限的基本知识,以下是需要单独申请的权限,共分为9组, 每组只要有一个权限申请成 ...

  3. Shiro源码分析-初始化-Realm

    在上一篇介绍SecurityManager的初始化过程中,也有realm的粗略介绍. realm的概念在安全领域随处可见: 各种中间件的realm.spring security的realm.shir ...

  4. Android6.0动态权限申请步骤以及需要注意的一些坑

    因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo.算是自己的笔记吧,可能会比较混乱,主要是方便以后查看.后期有别的问题,随时更 ...

  5. android 6.0获取权限

    Android版本升到6.0后最坑的就是权限问题,以下是我参考大神一个权限管理工具类,希望对大家有用 PermissionUtils.java import android.Manifest; imp ...

  6. 数据权限管理中心 - 基于mybatis拦截器实现

    数据权限管理中心 由于公司大部分项目都是使用mybatis,也是使用mybatis的拦截器进行分页处理,所以技术上也直接选择从拦截器入手 需求场景 第一种场景:行级数据处理 原sql: select ...

  7. Android 6.0 运行时权限处理问题

    序 自从升级到Android M以来,最大的改变就是增加了运行时权限RuntimePermission,6.0以上的系统如果没有做适配,运行了targetSDK=23的App时就会报权限错误.我们知道 ...

  8. Shiro源码分析之SecurityManager对象获取

    目录 SecurityManager获取过程 1.SecurityManager接口介绍 2.SecurityManager实例化时序图 3.源码分析 4.总结 @   上篇文章Shiro源码分析之获 ...

  9. Android--解决图片保存到相册显示1970年1月1日 8:00的问题

    import android.content.Context; import android.content.Intent; import android.database.Cursor; impor ...

随机推荐

  1. 用python编写一个合格的ftp程序,思路是怎样的?

      经验1.一般在比较正规的类中的构造函数.都会有一个verify_args函数,用于验证传入参数.尤其是对于系统传参.2.并且系统传参,其实后面大概都是一个函数名 例如:python server. ...

  2. Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)

    众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页. ...

  3. Hive入门指南

    转自:http://blog.csdn.net/zhoudaxia/article/details/8842576 1.安装与配置 Hive是建立在Hadoop上的数据仓库软件,用于查询和管理存放在分 ...

  4. shell 实用脚本

    功能 将当前目录下文件拷贝至另一目录下,且拷贝前先备份 #!/bin/sh #脚本功能 #覆盖文件前先备份 cfsuffix=$(date +%Y%m%d); #备份文件后缀 ]; then #输入参 ...

  5. python爬虫练习之批量下载zabbix文档

    # -*- coding: UTF-8 -*- import requests,re,time url = 'https://www.zabbix.com/documentation/3.4/zh/m ...

  6. 使用Spring Mail发送QQ邮件

    一.邮箱设置 QQ邮箱设置:http://service.mail.qq.com/cgi-bin/help?id=28, 下面这些服务需要开启(需要设置邮箱独立密码): 二.applicationCo ...

  7. 接口开发(login、reg)

    接口开发: import flask,json,pymysql,hashlib server = flask.Flask(__name__)# 把当前这个python文件当做一个服务 def my_d ...

  8. plsql之导入数据乱码

     问题现象: 首先是使用了plsql 8.0版本客户端导入 ANSI as UTF-8 的字符集 格式sql 文件进行数据的导入, 然后检查了所有的系统环境的字符集和plsql 的字符集 都OK 的但 ...

  9. LCA-tarjan understand 2

    下面是一个最基础的LCA题目    http://poj.org/problem?id=1330 赤裸裸的 题意 输入cas 后  有cas组数据 输入 n   再输入n-1 条边    之后输入x ...

  10. JS 深拷贝/合并

    var mix = function(r, s, ov) { if (!s || !r) return r; if (ov === undefined) ov = true; for (var p i ...