Android6.0引入了全新的权限管理方式,也就是运行时权限,至于什么是运行时权限,我们先看一下6.0以前的权限处理。

6.0以前的权限

6.0以前的系统,我们在安装一个应用的时候会默认赋予所有权限。

pre-marshmallow-permission.jpg

安装的时候会提示应用需要获取的所有权限,选择安装则会全部获取,如果要拒绝获取权限,只能放弃安装应用。用户无法选择获取或者放弃某些权限。

6.0的运行时权限

什么是运行时权限?举个栗子,以某个需要拍照的应用为例,当运行时权限生效时,其Camera权限不是在安装后赋予,而是在应用运行的时候进行请求权限(比如当用户按下”相机拍照“按钮后)看到的效果则是这样的,提示用户需要权限,用户选择允许,才能获取到该权限。

marshmallow-permission.png

一个问题:我们必须要支持运行时权限吗?

如果我们不想启用运行时权限其实很简单,我们只要,把targetSdkVersion设置为设置低于23就可以了,系统会认为我们的应用还不支持新特性,会按照棉花糖以前的版本进行处理。这样的处理不会有任何的问题,但有一点,棉花糖对每一个应用都有一个权限管理界面,是这样

6a195423jw1ezwqnmjhcdj20u01hc40k.jpg

如果用户手动关闭了我们应用的某些权限,问题就出现了,运行应用时可能会出现崩溃。下面这个例子

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

String deviceId = telephonyManager.getDeviceId();

if (deviceId.equals(mLastDeviceId)) {//This may cause NPE

//do something

}

如果用户撤消了获取DeviceId的权限,那么再次运行时,deviceId就是null,如果程序后续处理不当,就会出现崩溃。所以说该来的还是要来的,我们需要处理好运行时权限问题。

权限分类

android系统的权限很多但不是所有的权限都是敏感权限,棉花糖将android系统权限分为四类。

1.正常权限(Normal Protection)

2.危险权限(Dangerous)

3.特殊权限(Particular)

4.其他权限(几乎使用不到)

1.正常权限

这一类权限是对用户隐私影响较小,没有什么安全问题,这类权限会像6.0以前的系统一样,安装就获取到这些权限,没有用户提醒,也不能被取消。下面是正常权限列表。

ACCESS_LOCATION_EXTRA_COMMANDS

ACCESS_NETWORK_STATE

ACCESS_NOTIFICATION_POLICY

ACCESS_WIFI_STATE

BLUETOOTH

BLUETOOTH_ADMIN

BROADCAST_STICKY

CHANGE_NETWORK_STATE

CHANGE_WIFI_MULTICAST_STATE

CHANGE_WIFI_STATE

DISABLE_KEYGUARD

EXPAND_STATUS_BAR

GET_PACKAGE_SIZE

INTERNET

KILL_BACKGROUND_PROCESSES

MODIFY_AUDIO_SETTINGS

NFC

READ_SYNC_SETTINGS

READ_SYNC_STATS

RECEIVE_BOOT_COMPLETED

REORDER_TASKS

REQUEST_INSTALL_PACKAGES

SET_TIME_ZONE

SET_WALLPAPER

SET_WALLPAPER_HINTS

TRANSMIT_IR

USE_FINGERPRINT

VIBRATE

WAKE_LOCK

WRITE_SYNC_SETTINGS

SET_ALARM

INSTALL_SHORTCUT

UNINSTALL_SHORTCUT

对于这些权限,我们只需要在Manifest中指定,应用安装就会获取。

2.危险权限

危险权限才是运行时权限的主要处理对象,这些权限可能会有隐私问题,或者影响其他应用的运行,危险权限可以分为以下几组:

CALENDAR

CAMERA

CONTACTS

LOCATION

MICROPHONE

PHONE

SENSORS

SMS

STORAGE

对于各组权限对应的具体权限如下:

6a195423jw1ezwpc11cs0j20hr0majwm.jpg

关于权限我们需要下面几个API

int checkSelfPermission(String permission) 用来检测应用是否已经具有权限

void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限

void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

请求Camera的权限

private static final int REQUEST_PERMISSION_CAMERA_CODE = 1;

@Override

public void onClick(View v) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (!(checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {

if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {

Toast.makeText(this, "Please grant the permission this time", Toast.LENGTH_LONG).show();

}

requestCameraPermission();

}

}

}

private void requestCameraPermission() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA_CODE);

}

}

@Override

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) {

int grantResult = grantResults[0];

boolean granted = grantResult == PackageManager.PERMISSION_GRANTED;

Log.i(LOGTAG, "onRequestPermissionsResult granted=" + granted);

}

}

通常情况下,我们会得到这样的一个对话框

marshmallow-permission.png

我们可以在onRequestPermissionsResult中获取用户的选择情况进行相应的处理。但如果用户选择了否,我们再次申请的时候就会多一个checkbox

6a195423jw1ezwtz1ljjgj20u01hcad8.jpg

如果用户选择了不在询问,然后拒绝,我们的应用基本上就获取不到这个权限了,shouldShowRequestPermissionRationale这个API可以帮我们判断接下来的对话框是否包含”不再询问“选择框,我们可以这样使用。这样如果我们第一次申请权限失败后,在申请权限的时候就会弹出提示Toast,这个使用一定要向用户说明我们为什么要申请这个权限,来做什么。

if (!(checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED)) {

if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {

Toast.makeText(this, "Please grant the permission this time", Toast.LENGTH_LONG).show();

}

requestReadContactsPermission();

} else {

Log.i(LOGTAG, "onClick granted");

}

对于同时申请多个权限我们可以

String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE};

requestPermissions(permissions, REQUEST_CODE);

效果是这样,同时申请多个权限可以避免弹出多个对话框造成不好的视觉影响。

6a195423jw1ezxulzbeu2j20iq0ggt9y.jpg

3.特殊权限

特殊权限是指特别敏感的权限,这里主要是指两个。

SYSTEM_ALERT_WINDOW,设置悬浮窗

WRITE_SETTINGS 修改系统设置

关于上面两个特殊权限的授权,做法是使用startActivityForResult启动授权界面来完成,下面是请求SYSTEM_ALERT_WINDOW权限。

private static final int REQUEST_CODE = 1;

private void requestAlertWindowPermission() {

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

intent.setData(Uri.parse("package:" + getPackageName()));

startActivityForResult(intent, REQUEST_CODE);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REQUEST_CODE) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (Settings.canDrawOverlays(this)) {

Log.i("AlertWindowPermission", "onActivityResult granted");

}

}

}

}

需要注意:

使用Action Settings.ACTION_MANAGE_OVERLAY_PERMISSION启动隐式Intent

使用"package:" + getPackageName()携带App的包名信息

使用Settings.canDrawOverlays方法判断授权结果

WRITE_SETTINGS 使用的则是 Action Settings.ACTION_MANAGE_WRITE_SETTINGS,使用Settings.System.canWrite方法检测授权结果

android棉花糖,Android-6.0 棉花糖权限的那点事相关推荐

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

    感觉这个权限申请类写的比较好. 使用方法:activity直接继承就可以了. 看下mainactivity.java package com.qfy.permissiondemo;import and ...

  2. android m和6.0的区别吗,清甜棉花糖:安卓M/Android 6.0上手体验评测

    8月18日,谷歌正式确定了安卓最新版的操作系统为Android 6.0 Marshmallow(棉花糖)系统.同时还放出了安卓6.0棉花糖系统的第三个开发者预览版固件.据悉这将会是最后一个开发者预览版 ...

  3. android 6.0 连接电脑,如何通过蓝牙连接您的Android 6.0棉花糖设备到您的电脑 | MOS86...

    蓝牙已经存在多年了.它非常适用于窄带应用,如将手机连接到耳机或汽车音响设备.虽然没有太多带宽,您可以在Android和PC之间共享文件和文件夹.如果你想连接你的Android 6.0棉花糖设备通过蓝牙 ...

  4. Android教程 -05 Android6.0权限的管理

    视频为本篇博客知识的讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 height="498" width="510" src="http://pl ...

  5. android6.0麦克风权限,android 6.0权限检测以及6.0以下,麦克风、相机权限判断

    android 6.0以上权限 android 6.0以上权限,我是通过PermissionsDispatcher进行申请,操作的,具体使用方法,见PermissionsDispatcher,Andr ...

  6. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

  7. Android 6.0动态权限申请

    Android 6.0动态权限申请 特别感谢: https://www.jianshu.com/p/2fe4fb3e8ce0 本文是在该文的基础上添加了类似自己的读后感才完成的. 我并不希望成为白求恩 ...

  8. 原生Android之(6.0及以上)权限申请

    为什么Android的要申请权限 简单说下在Android6.0及6.0以上一些谷歌认为涉及"危险和用户隐私"的一些权限不仅要做清单文件(机器人/应用/ SRC / Android ...

  9. android wifimanager权限,Android 6.0.1 - 权限问题= wifiManager.getScanResults()返回0

    permissionsList.add()不起作用,但MainActivity.this.requestPermissions()正常工作.问题是它带来一个对话框询问用户是否允许位置权限.Androi ...

  10. android 6.0动态权限问题

    最近,我发现手机的6.0权限在小米手机上存在问题,我在网上搜了很多的代码,都没有解决这个问题,所以这里记录一下自己的android 6.0权限的解决代码,如果有问题,大家可以在网上自己在找找代码去解决 ...

最新文章

  1. 某程序员毕业进UC,被阿里收购!跳去优酷土豆,又被阿里收购!再跳去饿了么,还被阿里收购!难道阿里想收购的是他?...
  2. 移民澳洲好网站http://home.hexun.com/ausky/default.html
  3. C# 执行Cmd窗口中的命令 [复制文件实例]
  4. python json unicode_python2下解决json的unicode编码问题
  5. 网线重新插拔后恢复正常_14日科技精选:路由器经常掉线,必须重新插拔网线才能上网。什么原因?...
  6. day21 java的数字类
  7. python菜单栏_Python(Tkinter)创建的菜单不会显示
  8. 杭电 4548 美素数
  9. 深入浅出“跨视图粒度计算”--2、INCLUDE表达式
  10. HUE与YARN的集成
  11. [文摘20071008]全国软考相关-计算机技术与软件专业资格(水平)考试
  12. ABMultiValueCopyLabelAtIndex使用不当引起的内存泄漏
  13. sklearn学习笔记(3)svm多分类
  14. windows系统怎么用注册表修改桌面文件路径
  15. 基于python的web框架——Flask 学习笔记
  16. svg 地图_用于Power BI的SVG省市地图(带数据标签,含下载)
  17. C++入门基础之计算使用某快递公司运输货物的运费
  18. 打开outlook显示服务器内存不足,Outlook2013无法打开邮箱,报错提示可用内存不足...
  19. celeste第二章_蔚蓝全剧情全流程攻略 全关卡详解图文攻略
  20. 爬取boss直聘岗位数据进行数据分析

热门文章

  1. 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)
  2. 尼康d850相机参数测试软件,新功能介绍二:景深合成与自动调焦_尼康 D850_数码影像评测-中关村在线...
  3. html做图片模糊效果,CSS3 filter(滤镜) 制作图片高斯模糊无需JS
  4. 利用pandas将Excel分组比较获取差集并
  5. 推荐一个和孩子玩24点游戏的工具:益乐24点
  6. Kafka 的 Java 消费者如何管理 TCP 连接?
  7. 本周大新闻|CES 2023 AR/VR最全汇总
  8. 微交易平台搭建开发-盘内实时K线对接
  9. Windows8内核模式下开发NDIS应用 NDIS Filter讲解
  10. OTFS学习_12.15