[Android] Android M 运行时权限处理

原创 2016年06月01日 11:10:21

运行时权限介绍

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测,以下权限都需要在运行时判断:

身体传感器
日历
摄像头
通讯录
地理位置
麦克风
电话
短信
存储空间

运行时权限处理

Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,但这也只是一个临时的救急策略,用户还是可以在设置中取消授予的权限。

  • 声明目标SDK版本
    我们需要在build.gradle中声明targetSdkVersion为23
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.yourcomany.app"
        minSdkVersion 18
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
     }
     buildTypes {
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           }
      }
}
  • 检查并申请权限
    我们需要在用到权限的地方,每次都检查是否APP已经拥有权限,比如我们有一个下载功能,需要写SD卡的权限,我们在写入之前检查是否有WRITE_EXTERNAL_STORAGE权限,没有则申请权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
  //申请WRITE_EXTERNAL_STORAGE权限
  ActivityCompat.requestPermissions(this, new String[]{
  Manifest.permission.WRITE_EXTERNAL_STORAGE},
          WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
}
  • 请求权限后,系统会弹出请求权限的Dialog

  • 用户选择允许或拒绝后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    doNext(requestCode,grantResults);
}
  • 我们接着需要根据requestCode和grantResults(授权结果)做相应的后续处理
private void doNext(int requestCode, int[] grantResults) {
     if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
         if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
             // Permission Granted
         } else {
             // Permission Denied
         }
     }
 }

Fragment中运行时权限的特殊处理

  • 在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的onRequestPermissionsResult

  • 如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不会回调回来,建议使用getParentFragment().requestPermissions方法,这个方法会回调到父Fragment中的onRequestPermissionsResult,加入以下代码可以把回调透传到子Fragment

@Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    List<Fragment> fragments = getChildFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null) {
                fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
          }
      }
  }
}

相关阅读:Android 6.0+ 运行时权限探索

版权声明:本文为博主原创文章,技术需要传递,欢迎分享。

Android M运行时权限详解

好久之前在网上看到国外一篇关于M的权限机制详解,由于是英文的,刚好最近闲的没事做,顺手翻译一下。 英文原文地址:https://inthecheesefactory.com/blog/things-y...
  • lwk520136
  • lwk520136
  • 2016年06月16日 10:26
  • 3644

Android 6.0及运行时权限处理

需求 原生方式实现 封装框架 利用BaseActivity自己封装运行时权限 封装实战 实现思路 实现代码 课程中提到的一些小知识点...
  • m0_37168878
  • m0_37168878
  • 2017年03月21日 09:10
  • 616

Android开发之6.0运行时权限处理

Android 6.0运行时权限处理,权限分为九组,让用户授予所有权限由一个单一的行动包括。例如,授权联系人包括视图的能力和编辑联系人。请求权限被拒绝需要进一步阐述理由同意后再次请求权限...
  • AnalyzeSystem
  • AnalyzeSystem
  • 2016年04月27日 17:59
  • 7128

Android6.0运行时权限解决方案

Android中单点登录的一种解决方案前提:服务端用户系统已集成token监听被踢下线的方式 任意请求返回token失效 在任意一个http请求中后台返回特定的code:与用户相关的http请求往往需...
  • qq_31255289
  • qq_31255289
  • 2016年08月22日 17:54
  • 1370

Android 6.0 运行时权限介绍和使用方法及其封装

Android 6.0 新特性之运行时权限以及封装Easypermissions的使用方法介绍
  • fkq_2016
  • fkq_2016
  • 2017年01月12日 11:24
  • 2599

Android M(6.0)运行时权限申请及遇到的坑

一、概述         在对动态权限申请进行详细说明时,还是先大致介绍下6.0后,google对权限的一个归类和划分。在Android M之前,再开发应用的时候,程序员只需要在AndroidMan...
  • victor_fang
  • victor_fang
  • 2017年01月20日 15:57
  • 610

Android 6.0 运行时权限处理解析

1.概述  不知道大家有没有遇到过这种情况,开发app的时候发现自己手机选择照片是正常的,测试那边的一台手机怎么搞都不行,然后查看版本之后才发现是6.0的手机。      随着Android ...
  • z240336124
  • z240336124
  • 2016年11月11日 17:55
  • 16910

Android 6.0 运行时权限封装框架

1.概述  视频讲解都已经录了好几天,但是最近实在抽不开身一直在忙Unity3D,就连光棍节都在写,上次我们只是写了Android 6.0 运行时权限处理解析,但是并未对其做代码封装,这一次我们做一个...
  • z240336124
  • z240336124
  • 2016年11月15日 18:40
  • 14023

Android6.0运行时权限的处理及解决办法

问题背景随着今年Android6.0系统的国产ROM终于来了,适配6.0已经势在必行了。最近也有很多开发者在微信私聊和咨询我遇到的问题,其中有一些都是关于Android6.0权限的,我感觉有必要写一篇...
  • loongggdroid
  • loongggdroid
  • 2016年05月05日 15:23
  • 3572

Android6.0运行时权限,化繁为简

前言 权限申请效果 GIF.gif GitHub地址:PermissionUtils Android8.0昨天已经发布,但是关于Android版本的最新统计,来看看图 image.png 很明...
  • dazhaoDai
  • dazhaoDai
  • 2017年09月12日 21:07
  • 440
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Android] Android M 运行时权限处理
举报原因:
原因补充:

(最多只允许输入30个字)