android6.0运行时权限完美封装方法

前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目。于是把它完整的敲了下来。并在此基础上添加上自己的一些见解,封装成一个完整的demo,希望与大家进行交流与。

在这里我进行了简单的在activity中简单进行获取权限和工具类封:

某一个权限被禁止或者是所有的权限被禁止,这里我做了去到烯烃界面去设置的处理:

如果要开启多个权限的话,则可能不同的手机显示的效果不同,有些手机在权限Dialog上显示需要获取权限的个数,但有些手机需要多少个权限显示多少个。

最后一步处理:如果某个权限被禁止的话,则到设置界面去提示用户去打开权限:

部分代码:

/**
 * 类功能描述:在activity中进行检测权限的简单方法 </br>
 * 博客地址:http://blog.csdn.net/androidstarjack
 * @author 老于
 * @version 1.0 </p> 修改时间:</br> 修改备注:</br>
 */
public class CheckPermissionOnActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_checkpermission1);
  ButterKnife.bind(this);
 }
 @OnClick({R.id.btn_runtimne_onClick, R.id.btn_runtimne_onClick_multify,R.id.btn_runtimne_onClick_seting})
 public void onMyListener(View v){
  switch (v.getId()){
   case R.id.btn_runtimne_onClick:
    requestToUserPersiom(1);
    break;
   case R.id.btn_runtimne_onClick_multify:
    requestToUserPersiom(2);
    break;
   case R.id.btn_runtimne_onClick_seting:
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.parse("package:"+ getPackageName()));
    startActivity(intent);
    break;
  }
 }
 public void requestToUserPersiom(int permisionIndexCount){
  switch (permisionIndexCount){
   case 1:
    ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE},100);//去请求权限
    break;
   case 2:
   case 3:
   case 4:
    ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
    break;

  }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  if(requestCode == 100){
   if(grantResults.length >0 ){
    for (int i = 0; i < grantResults.length; i++) {
     if( grantResults[i] == PackageManager.PERMISSION_DENIED){//拒绝啦
      return ;
     }
    }
    doosmething();
   }
  }
 }

 /**
  * 做其他事情
  */
 public void doosmething(){
  GetToast.useString(CheckPermissionOnActivity.this,"开始做其他事情了");
 }
}

封装成BaseActivitgy工具类:

public class BasePermisitionActivity extends Activity {

 private static final int REQUESTPERMISSION_CODE = 100;
 private static QuestPermissionListener questPermissionListener;
 private AlertDialog.Builder builder;
 private AlertDialog alertDialog;

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ActivityManager.addPermissionActivty(this);
 }

 public static void requestRuntimePermission(String [] permissions,QuestPermissionListener questPermissionListener){
  Activity actyivty = ActivityManager.permissionActivilyList.get(ActivityManager.permissionActivilyList.size() -1);
  if(actyivty == null){
   return;
  }
  List<String> neetRequestPermisList = new ArrayList<String>();
  for (String permission : permissions) {
   if(ActivityCompat.checkSelfPermission(actyivty,permission) == PackageManager.PERMISSION_DENIED){
    neetRequestPermisList.add(permission);
   }
  }
  BasePermisitionActivity.questPermissionListener = questPermissionListener;
  if(!neetRequestPermisList.isEmpty()){
   ActivityCompat.requestPermissions(actyivty,neetRequestPermisList.toArray(new String[neetRequestPermisList.size()]),REQUESTPERMISSION_CODE);
  }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  if(requestCode == REQUESTPERMISSION_CODE){
   for (int i = 0; i < grantResults.length; i++) {
    int granrRequest = grantResults[i];
    if(granrRequest == PackageManager.PERMISSION_DENIED){//权限被拒绝啦
     if(questPermissionListener != null){
      questPermissionListener.denySomePermission();
     }
      return;
    }
   }
   questPermissionListener.doAllPermissionGrant();
  }
 }

 @Override
 protected void onResume() {
  super.onResume();

 }

 public void onResumeCheckPermission(String ...permission){
  if(PermisionControl.lackMissPermission(this,permission)){
   showMissPermissionDialog();
  }
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  ActivityManager.removePermissionActiivty(this);
 }
 /**
  * 丢失权限,进行弹框设置
  */
 public void showMissPermissionDialog() {
  if (builder == null) {
   builder = new AlertDialog.Builder(BasePermisitionActivity.this);
   builder.setTitle("帮助");
   String msg = "当前应用缺少必要权限。<br>\r请点击\"设置\"-\"权限\"-打开所需权限。<br>\r\r最后点击两次后退按钮,即可返回。";
   builder.setMessage(Html.fromHtml(msg));
   //materialDialog.setMovementMethod(LinkMovementMethod.getInstance());
   builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
     alertDialog.dismiss();
    }
   });
   builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
     alertDialog.dismiss();
     startAppSettings();
    }
   });
   alertDialog = builder.create();
   alertDialog.show();
  } else {
   alertDialog.show();
  }
 }
 // 启动应用的设置
 public void startAppSettings() {
  try {
   Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
   intent.setData(Uri.parse("package:"+ getPackageName()));
   startActivity(intent);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

与其相关的工具类:

/**
 * 类功能描述:6.0运行时权限 </br>
 * permission权限控制器</br>
 * 博客地址:http://blog.csdn.net/androidstarjack
 * @author 老于
 * Created on 2017/1/3/002
 * @version 1.0 </p> 修改时间:</br> 修改备注:</br>
 */
public class PermisionControl {
 /**
  * 检查所有的权限是否被禁止
  */
 public static boolean lackMissPermission(Context cnt ,String... permission){
  boolean relust = true ;
  for (String per : permission) {
   if(ActivityCompat.checkSelfPermission(cnt,per) == PackageManager.PERMISSION_DENIED){
    relust = false ;
    break;
   }
  }
  return relust;
 }

 /**
  * 请求运行时权限
  * eg:
  */
 public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){
  BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener);
 }
}

以及其他的一些封装:

public class PermissionUsage {
 /**********权限:打电话,写入内存卡,定位********/
 public static String[] LOACATION_CAMERA = { Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,
   Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE};
 /**********权限:读取内存卡********/
 public static String[] READ_EXTRASORE = { Manifest.permission.READ_EXTERNAL_STORAGE};
 /**********权限:打电话权限********/
 public static String[] RCALL_PHONE = { Manifest.permission.READ_EXTERNAL_STORAGE};
}

以上这篇android6.0运行时权限完美封装方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 安卓Android6.0权限动态获取操作示例

    本文实例讲述了安卓Android6.0权限动态获取操作.分享给大家供大家参考,具体如下: 众所周知 , 安卓6.0现在运用的越来越广泛 , 因为相对于之前的几个版本 , 对于用户权限这个概念确实不是很重视 , 而6.0 之后 , 为了提升用户的操作安全性 ,  运行时权限诞生了, 就是在用户运行软件的时候动态获取所需要的权限 , 下面跟大家分享一个我的代码案例 : import android.Manifest; import android.app.AlertDialog; import an

  • 详解Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了. 背景: 有关外置sdcard的读写权限 <uses-permission android:name="android.permissi

  • Android权限管理之Permission权限机制及使用详解

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,所以选择先去了解一下Android的Permission权限机制及使用 Android权限机制: 权限是一种安全机制.Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组

  • Android内部存储改变读取权限的方法

    在开发时,手机先要ROOT,然后在通过代码改变权限. <span style="color:#330033;">public synchronized static boolean getRoot(String paramString) { Process process = null; DataOutputStream os = null; try { process = Runtime.getRuntime().exec("su"); os = ne

  • Android学习之文件存储读取

    前言 相信大家都知道知道,在AndroidOS中,提供了五中数据存储方式,分别是:ContentProvider存储.文件存储.SharedPreference存储.SQLite数据库存储.网络存储.那么这一篇,我们介绍文件存储. 1.Android文件的操作模式 学过Java的同学都知道,我们新建文件,然后就可以写入数据了,但是Android却不一样,因为Android是 基于Linux的,我们在读写文件的时候,还需加上文件的操作模式,Android中的操作模式如下: 2.文件的操作模式 我们

  • Android需要提升权限的操作方法

    权限提升方法:一种方法:1.在AndroidManifest.xml中的manifest节点中添加 android:sharedUserId="android.uid.system".2.添加后程序在虚拟机上是不可以直接用的.但可以用eclipse编译成apk.3.(这一步经验证不执行即可)编译成apk后用压缩工具打开apk,把META-INF目录中的CERT.SF.CERT.RSA 两个文件删除.4.使用android自带的签名工具signapk.jar 以及源码中的platform

  • android6.0运行时权限完美封装方法

    前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目.于是把它完整的敲了下来.并在此基础上添加上自己的一些见解,封装成一个完整的demo,希望与大家进行交流与. 在这里我进行了简单的在activity中简单进行获取权限和工具类封: 某一个权限被禁止或者是所有的权限被禁止,这里我做了去到烯烃界面去设置的处理: 如果要开启多个权限的话,则可能不同的手机显示的效果不同,有些手机在权限Dialog上显示需要获取权限的个数,但有些

  • 详解Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装的事情,也不会再不征求用户授权的情况下,就可以任意的访问用户隐私,而且即使在授权之后也可以及时的更改权限.这就是6.0版本做出的更拥护和注重用户的一大体现. 一.认知 今天我们就来学习下Android6.0的权限管理. Android6.0系统把权限分为两个级别: 一个是Normal Permiss

  • 详解Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以上设备越来越多了,所以Android 6.0 权限适配是必不可少的工作,这里主要介绍一下我们公司是如何做Android 6.0权限适配的. Android 6.0以下非运行时权限: 根据上面博客我们很清楚的知道,Android的权限其实就是为了程序之间更加的安全的访问,所以权限有等级之分,比如:No

  • 谈谈Android6.0运行时的权限处理

    运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上, 又新增了运行时权限动态检测,以下权限都需要在运行时判断: 1.身体传感器 2.日历    3.摄像头 4.通讯录 5.地理位置 6.麦克风 7.电话 8.短信 9.存储空间 在 Android 6.0 中,app 如果想要获得某些权限,会在应用中弹出一个对话框,让用户确认是否授予该权限. 具体的截图如下: 这要做的好处就是运行一个 app 时可以拒绝其中的某些权限,防止 app 触及到你的

  • Android 7.0 运行时权限弹窗问题的解决

    Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作. normal 表示权限是低风险的,不会对系统.用户或其他应用程序造成危害: dangerous 表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限: signature 表示只有当应用程序所用数字签名与声明引权限的应用程序所用数字签名相同时,才能将权限授给它

  • 详解Android运行时权限及APP适配方法

    Android 6.0起,Android加强了权限管理,引入运行时权限概念.对于: 1. Android 5.1(API 22)及以前版本,应用权限必须声明在AndroidManifest.xml中,应用在安装时,Android会列出其所需的所有权限供用户确认安装. 2. Android 6.0(API 23)及以后版本,应用权限必须声明在AndroidManifest.xml中,但权限分为普通权限(Normal Permissions)和危险权限(Dangerous Permissions),

  • Android6.0动态申请权限所遇到的问题小结

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目的是在申请权限时,只要用户允许同一权限组的任意一条权限,那么该组的其他权限也就默认是允许的.不过据高人介绍,在使用时最好是用到哪个权限就具体的请求该权限,因为保不齐哪天谷歌一高兴就把权限组换了甚至删了 group:android.permission-group.CONTACTS permissio

  • Android运行时权限终极方案(PermissionX)

    各位小伙伴们大家早上好,不知道你的<第三行代码>已经读到哪里了? 有些朋友的阅读速度真是令人印象深刻,我记得在<第三行代码>刚刚发售一周不到的时间里,竟然就有人已经读到第9章了(因为公众号后台有人回复第9章里隐藏的关键字).现在,<第三行代码>已经出版一个月有余了,相信已经有不少朋友将全本书都看完了. 全书都看完的朋友一定知道,<第三行代码>的最后一章是带着大家一起开发了一个开源库:PermissionX.这一章的主旨是为了让你了解一个开源库整体的开发与发布

  • 基于创建Web项目运行时出错的解决方法(必看篇)

    1.目录结构 2.各文件内容 index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="/Servlet" method="

随机推荐