文档章节

Android6.0 权限管理那些事(一)

二进制的忧伤
 二进制的忧伤
发布于 2016/01/10 21:24
字数 546
阅读 142
收藏 5

运行时权限介绍

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

    @Overridepublic 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

    @Overridepublic 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);            }        }    }}

本文转载自:http://www.tuicool.com/articles/nEBvU3

二进制的忧伤
粉丝 9
博文 19
码字总数 16902
作品 0
深圳
程序员
私信 提问
Android系统权限那些事

Android6.0带来了新的权限管理方式,本文主要来源于官方文档,加入了自己的理解,目的是想总结Android6.0权限管理的新方式,其他部分可能主要是总结式的带过,后续再详细分析。 一.Security...

海阔天空玩世不恭
2015/12/16
4.9K
6
Android6.0动态权限管理库

在Android开发中,申请个权限本来很简单的事情,可就因为Android6.0出个动态权限,整的那个复杂度是几何倍增。本着我们开发向简的宗旨,今天我在这推荐一个Android6.0动态权限管理库Runtime...

wkp111
2017/12/27
0
0
Android开发——Android 6.0权限管理机制详解

0.前言 最近在研究所实习,我负责维护Android手机取证项目的Android客户端,有客户反映我们的APP在Android6.0无响应,经过调试发现SD卡读写权限权限被拒绝。但明明是在AndroidManifest.xml...

SEU_Calvin
2016/08/09
0
0
警察蜀黍,这有个装正经又不正经的App!

先说一个悲伤的故事。 有一天,小明跟爸爸说,爸,我要搞学习,需要下载一个报名补习班的App。然后,小明装模作样地用爸爸的手机下载了一个正经App,然后打开了一些不可描述的网站,偷偷进行...

灵火K
01/08
0
0
Android6.0 权限管理学习

一、前言 Android M 开始,App不会在安装的时候授予权限,而是在运行时一个一个的询问用户授予权限。 1. 运行时权限仅当我们设置targetSdkVersion >= 23才起作用,当然还要是M系统的手机。a...

xingjm8511
2016/05/29
115
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
32分钟前
5
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
5
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0
VUE 计算属性

本文转载于:专业的前端网站▶VUE 计算属性 1、示例代码 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <title>vue示例</title> </hea......

前端老手
昨天
7
0
快速搭建LNMT平台和环境部署 Tomcat详解

Tomcat部署的基本概念 1. CATALINA_HOME与CATALINA_BASE分别指什么?     CATALINA_HOME指的是Tomcat的安装目录     bin:\\Tomcat一些脚本存放目录,比如启动脚本startup.bat/start...

网络小虾米
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部