感觉这个权限申请类写的比较好。

使用方法:activity直接继承就可以了。

看下mainactivity.java

package com.qfy.permissiondemo;import android.os.Bundle;public class MainActivity extends CheckPermissionsActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

再来看下申请权限的CheckPermissionsActivity.java

/****/
package com.qfy.xiayiyemap;import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.view.KeyEvent;import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;/*** 继承了Activity,实现Android6.0的运行时权限检测* 需要进行运行时权限检测的Activity可以继承这个类** @author hongming.wang* @创建时间:2016年5月27日 下午3:01:31* @项目名称: AMapLocationDemo* @文件名称:PermissionsChecker.java* @类型名称:PermissionsChecker* @since 2.5.0*/
public class CheckPermissionsActivity extends Activity {/*** 需要进行检测的权限数组*/protected String[] needPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE};private static final int PERMISSON_REQUESTCODE = 0;/*** 判断是否需要检测,防止不停的弹框*/private boolean isNeedCheck = true;@Overrideprotected void onResume() {super.onResume();if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {if (isNeedCheck) {checkPermissions(needPermissions);}}}/*** @param permissions* @since 2.5.0*/private void checkPermissions(String... permissions) {try {if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {List<String> needRequestPermissonList = findDeniedPermissions(permissions);if (null != needRequestPermissonList&& needRequestPermissonList.size() > 0) {String[] array = needRequestPermissonList.toArray(new String[needRequestPermissonList.size()]);Method method = getClass().getMethod("requestPermissions", new Class[]{String[].class, int.class});method.invoke(this, array, PERMISSON_REQUESTCODE);}}} catch (Throwable e) {}}/*** 获取权限集中需要申请权限的列表** @param permissions* @return* @since 2.5.0*/private List<String> findDeniedPermissions(String[] permissions) {List<String> needRequestPermissonList = new ArrayList<String>();if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {try {for (String perm : permissions) {Method checkSelfMethod = getClass().getMethod("checkSelfPermission", String.class);Method shouldShowRequestPermissionRationaleMethod = getClass().getMethod("shouldShowRequestPermissionRationale",String.class);if ((Integer) checkSelfMethod.invoke(this, perm) != PackageManager.PERMISSION_GRANTED|| (Boolean) shouldShowRequestPermissionRationaleMethod.invoke(this, perm)) {needRequestPermissonList.add(perm);}}} catch (Throwable e) {}}return needRequestPermissonList;}/*** 检测是否所有的权限都已经授权** @param grantResults* @return* @since 2.5.0*/private boolean verifyPermissions(int[] grantResults) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}@TargetApi(23)public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] paramArrayOfInt) {if (requestCode == PERMISSON_REQUESTCODE) {if (!verifyPermissions(paramArrayOfInt)) {showMissingPermissionDialog();isNeedCheck = false;}}}/*** 显示提示信息** @since 2.5.0*/private void showMissingPermissionDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(R.string.notifyTitle);builder.setMessage(R.string.notifyMsg);// 拒绝, 退出应用builder.setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}});builder.setPositiveButton(R.string.setting,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {startAppSettings();}});builder.setCancelable(false);builder.show();}/*** 启动应用的设置** @since 2.5.0*/private void startAppSettings() {Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);intent.setData(Uri.parse("package:" + getPackageName()));startActivity(intent);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {this.finish();return true;}return super.onKeyDown(keyCode, event);}}

这个类还有个好处,就是不需要继承appcompatActivity,如果写demo用到权限申请这个类无疑是最好的选择!因为不需要继承appcompatActivity类可以让apk包非常小。如下图;

如果看不懂,我直接提供一份源码。大佬勿喷。

点击下载

Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码相关推荐

  1. Android开发之Dialog对话框(弹框)工具类

    公司项目里面扣出来的 我们来看下弹框效果 直接上代码 ScreenSizeUtils.java package 导入自己的包;import android.content.Context; impor ...

  2. vc++6.0:MFC写的一个汉字取模软件(附源码)

    vc++6.0:MFC写的一个汉字取模软件(附源码) 一.毕业有九年了,突然想起以前在大学时候用MFC写的一个汉字取模软件.主要的功能是在PC上获取汉字16X16点阵数据然后通过串口把点阵数据发送给A ...

  3. android 定位工具类,高德地图定位工具类

    引言 定位功能初始化设置时耗时较多,如果放在Activity中操作,难免会有Activity切换较慢的问题.通过该工具类,可以实现一次初始化,多处随时调用.具有占用资源少,使用方便,便于复用,速度快, ...

  4. 从0到1搭建一个简易的在线客服问答系统(附源码)

    前言 首先我们先了解下这个概念,什么叫做问答系统(Question Answering System,简称 QA 系统)? 其实问答系统是一个比较常见的系统,在医疗系统/电商系统/零售业等等行业中都比 ...

  5. 【Android App】人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.比较两张人脸的相似程度 直方图由一排纵向的竖条或者竖线组成,横轴代表数据类型,纵轴代表数据多少. 图像直方图经常应用于特征提取.图像匹配等方面. ...

  6. 【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 手机最开始用于通话,后来增加了短信功能,初步满足了人与人之间的沟通需求.然而短信只能发文字,于是出现了能够发图片的彩信,但不管短信还是彩信,资费都太贵 ...

  7. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)

    都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...

  8. android触摸效果,Android开发进阶:仿MIUI12控件触摸反馈效果(下沉+倾斜)附源码...

    简单模仿了下MIUI12里控件的触摸反馈效果,转载请标明出处 效果简述 按压控件内圈区域,控件整体缩小,高度降低(阴影消失) 按压内圈 按压控件外圈区域,依据触摸点控件以中心为支点,向触摸点倾斜 按压 ...

  9. JAVA并发:并发工具类CountDownLatch、CyclicBarrier、Semaphore使用及源码分析

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 1 CountDownLa ...

最新文章

  1. mysql没法安装_mysql没法使用、没法启动服务的解决方法
  2. python入门学习课程推荐
  3. python编程(再述rpc)
  4. linkscrpit
  5. kotlin null_Kotlin Null安全– Kotlin可空
  6. Android Audio子系统路由策略(三十六)
  7. 打仗最害怕的是什么?后方出事
  8. Python刚刚尝试就遇:SyntaxError: invalid syntax
  9. arm-linux-gcc交叉编译器和gcc编译器的下载地址
  10. 【FastDFS-V5.11】Linux下FastDFS+Nginx实现分布式图片服务器搭建详细教程(单机模式)
  11. 十进制和二进制相互转换
  12. 表情符号(emoji)大全,只此一文便够了
  13. 幸福密码:与原生家庭和解后,才能直面真正的自己
  14. 第2章 HFDS的Shell操作
  15. [转]PCB Layout中的走线策略
  16. 7.绘制统计图形——堆积折线图、间断条形图和阶梯图
  17. Bootloader的启动与功能
  18. 《机器学习实战》学习笔记(三):决策树
  19. (翻译)色彩饱和度影响用户效率的方式
  20. python print用法可以不加引号吗_python的print函数不加括号吗

热门文章

  1. verilog7人表决电路设计
  2. 《c语言从入门到精通》看书笔记——第5章 常用的数据输入输出函数
  3. 系统服务器如何给指定磁盘扩容_刀片服务器如何选择操作系统?
  4. java orm框架什么意思_ORM框架是什么
  5. this super java_java中 this 和super的用法
  6. 6.C语言迷宫程序界面版
  7. cocos cteator中tiled模式 用图集容易出线
  8. 201621123058《java程序设计》第二周学习总结
  9. RxJava中的doOnSubscribe默认运行线程分析
  10. 在javascript当中发现了一个没有调用者的方法。