Android 6.0 动态权限机制

安卓6.0适配问题 (主华为 p7 p8) 最近半路接手一个项目,这项目从最开始设计的时候是没有兼容到6.0这个版本趋势. 一些普通功能还好,随着项目内功能越来越多,需求也越来越多,所以导致很多问题, 最近在一个技术交流群中,也有很多人问了类似的问题,所以特别来这里总结一波, 也希望遇到相同问题的人再看到这篇文章之后能快速解决问题. 首先来描写基于安卓6.0不做处理的话,可能会出现一些什么问题: 1.百度地图使用闪退 阅读详情

一、权限分类

1.Dangerous permissions
  • CALENDAR
    • READ_CALENDAR
    • WRITE_CALENDAR
  • CAMERA
  • CONTACTS
    • READ_CONTACTS
    • WRITE_CONTACTS
    • GET_ACCOUNTS
  • LOCATION
    • ACCESS_FINE_LOCATION
    • ACCESS_COARSE_LOCATION
  • MICROPHONE
    • RECORD_AUDIO
  • PHONE
    • READ_PHONE_STATE
    • CALL_PHONE
    • READ_CALL_LOG
    • WRITE_CALL_LOG
    • ADD_VOICEMAIL
    • USE_SIP
    • PROCESS_OUTGOING_CALLS
  • SENSORS
    • BODY_SENSORS
  • SMS
    • SEND_SMS
    • RECEIVE_SMS
    • READ_SMS
    • RECEIVE_WAP_PUSH
    • RECEIVE_MMS
  • STORAGE
    • READ_EXTERNAL_STORAGE
    • WRITE_EXTERNAL_STORAGE
2.Normal Permissions
  • 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
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • READ_SYNC_SETTINGS
  • READ_SYNC_STATS
  • RECEIVE_BOOT_COMPLETED
  • REORDER_TASKS
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • REQUEST_INSTALL_PACKAGES
  • SET_ALARM
  • SET_TIME_ZONE
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • TRANSMIT_IR
  • UNINSTALL_SHORTCUT
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
  • WRITE_SYNC_SETTINGS

二、动态获取权限

从Android6.0开始,用户对App的授权发生在App运行的时候而不是App安装的时候,这就意味着用户授权不再是当安装App或者更新App时同意授权才能进行安装。

系统权限被分为正常权限和危险权限两类(见一、权限分类):
- 正常权限不会直接威胁到用户隐私,当使用正常权限时只需要在Manifest文件中声明,系统自动进行授权。
- 危险权限涉及到用户隐私数据,当使用危险权限时,不仅仅是在Manifest文件中声明,而且还需要用户明确同意后才可以使用。

无论是正常权限或者危险权限,都需要在Manifest中声明,但是由于不同的系统版本以及App的TargetSDK不同,会有不同的影响:
- 若设备运行的是Android5.1之前的系统,或者App的TargetSDK为22之前的,当你在Manifest中声明使用了危险权限时,用户只能在安装App时同意授权才能进行安装,否则用户不同意授权则无法安装App;
- 若设备运行的是Android6.0之后的系统,或者App的TargetSDK为23之后的,当你在Manifest中声明使用了危险权限时,必须在App运行时请求所有危险权限的授权且用户可选择是否授权危险权限的使用。当用户不授权危险权限的使用时,App仍可以在有限的权限条件下运行。

需要注意的是,从Android 6.0 (API level 23)后用户可以对App的权限进行管理,无论App的Target是否为低的API Level。所以需要开发人员对App进行测试以确保当某些权限被用户禁止后仍然能以合适的表现方式运行,而不是崩溃!!!

1.检查权限

当执行需要某个危险权限的操作时,必须每次检查是否被授权了该权限。用户可任意授权或者禁止授权,即使昨天授权了危险权限的使用,今天也可以禁止,所以检查权限是必要的。

通过调用ContextCompat.checkSelfPermission()进行权限检查,以检查WRITE_CALENDAR权限为例:

// 确保thisActivity为当前的Activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
switch(permissionCheck){
case PackageManager.PERMISSION_GRANTED:
    // TODO 权限被授权使用
    break;
case PackageManager.PERMISSION_DENIED:
    // TODO 权限被禁止使用,App需要明确向用户请求该权限的使用
    break;
}
2.请求权限

若App在Manifest声明使用危险权限时,必须向用户请求这些危险权限的使用权。Android提供一些方法方便开发者请求权限的使用,当这些方法被调用时,将弹出一个标准的无法自定义的Android对话框。

(1)向用户解释使用某些危险权限的原因

在某些情况下,你可能需要帮助用户理解为什么App需要使用这些权限,所以在App请求权限之前,需要考虑向用户提供使用权限的相关解释,而这些解释尽量言简意赅且便于用户理解。

这里建议开发者在用户已经禁止了危险权限的请求时再向用户提供权限使用的解释(最优的方法是在请求权限时就对用户进行解释)。

Android提供的shouldShowRequestPermissionRationale()方法可以帮助开发者确定用户何时需要一个对危险权限授权的解释。当App已经请求过权限且被用户禁止了的时候,该方法返回true,此时就需要向用户进行权限使用的解释;当用户在权限请求对话框中禁止App权限的使用且选择了“Don’t ask again”的选项时,该方法返回false;还有就是当设备策略(a device policy)禁止App使用权限时,该方法也会返回false。

(2)请求需要的权限

通过调用requestPermissions()方法请求需要的权限。

当调用该方法传递所需权限的同时,也需要传递一个整型RequestCode来标记该权限的请求以区分不同的权限请求。

该方法为异步方法,当用户对权限请求对话框进行响应后,系统会立刻回调App中特定的回调方法并传入结果数据(见“(3)处理权限请求响应”),结果数据包括之前传递的RequestCode。
以下为示例代码:

// 以下thisActivity为当前Activity
// 权限被禁止时的操作
if (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) 
        != PackageManager.PERMISSION_GRANTED) { 
    // 调用该方法判断是否需要给出权限使用的解释
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,Manifest.permission.READ_CONTACTS)) {
        // "异步"向用户做出解释(不要阻塞线程)
        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // 当用户了解权限使用原因后,请尝试再次请求权限
        // sees the explanation, try again to request the permission.
    } else {
        // 不需要给出权限使用的解释时,进行请求权限
        ActivityCompat.requestPermissions(
                thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                REQUEST_CODE);
    }
}
(3)处理权限请求响应

当用户对权限请求对话框进行响应后,系统会回调App中onRequestPermissionsResult() 方法并传入结果参数数据,开发者需要覆盖该方法以处理判断权限是否被授权使用,此外,开发者可以通过返回的RequestCode区分不同权限请求的返回结果。
以下为示例代码:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE: {
            // 若请求被取消,结果数组为空
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限请求中所请求的第一个权限被授权使用,可以进行下一步操作
            } else {
                // 权限被禁止时的操作
            }
            return;
        }
        // 其它case来处理不同的权限请求响应
    }
}

需要注意的是,权限请求对话框只显示App所请求的单个权限所属的权限组而不是具体到某个权限,所以用户确认授权后是给予App使用权限组中的所有权限,而不仅仅是权限组中的单个权限的使用。例如,在Manifest中声明使用READ_CONTACTS和WIRTE_CONTACTS两个权限(这两个权限属于CONTACTS权限组),当App请求READ_CONTACTS权限且用户同意授权后,再请求WRITE_CONTACTS权限时系统不会与用户进行交互而是直接同意授权。

但是,App仍然需要明确的请求每个权限,而不仅仅是依赖于用户同意某个权限组而不去请求权限组中的某个权限,因为权限组中的单个权限可能在未来的Android releases中改变。

当系统要求用户授权权限时,用户有权选择让系统不再弹框提示。既然这样,无论App什么时候调用requestPermissions()请求权限,系统都会立刻否定该请求并在回调方法中返回PERMISSION_DENIED。这就意味着App调用requestPermissions()是没办法确保与用户的直接交互已经发生。

后记

第一次发博客有点紧张,有不足的地方请大家指出,我会及时更正。本篇文章是参考Android官方文档一字一句进行翻译并添加自己的理解,有哪里不对的地方还望大家指出,谢谢!同时转载记得注明出处哦!http://blog.youkuaiyun.com/linzerocandy/article/details/52355355

本文参考Demo:https://github.com/ZeroCandy/Demo(P.S.Demo里都是一些小Demo,平常写着玩仅供参考)

SAP 接口测试操作-业务顾问 业务顾问测试接口操作 阅读详情

相关推荐

WSL基础环境配置方案

通过以上步骤,您已经在 Windows 的 WSL 环境中成功搭建了一个完整的基础开发环境,包含 Docker、Kubernetes、Helm、kubectl、yq、Git 等工具。这套环境特别适用于在国内使用阿里云镜像服务部署和管理 Tekton,提升了开发和运维的效率和稳定性。

落魄书生的职业学习生涯 8876

Android 动态权限机制详解

Android 动态权限机制详解一.权限系统(一)6.0之前(二)6.0之后(三)8.0二.兼容适配(一)TargetSdkVersion(二)适配方法1.检查权限2.请求权限3.请求权限的结果4.适当的提示5.Fragment的权限请求6.流程图总结 一.权限系统 (一)6.0之前 Android为一些操作提供了必要的权限,比如我们的app想访问网络,就需要有网络权限android.permis...

依生依世 2742

从SD更新字库到FLASH,再用LCD显示

用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显...

weixin_30505751的博客 914

(Android 9.0)动态权限运行机制源码分析

概述 Google在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。应用的相关功能每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。动态权限申请的使用主要涉及到以下几种方法: 方法 作用 checkSelfPermission(@NonNull String permission) 检查权限 requestPe...

Peter的专栏 8624

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了如何使用FModel工具从UE5游戏的.pak文件中提取3D模型,并提供了Dumper-7的避坑指南。内容涵盖FModel工具链配置、UE5特有的unversioned properties问题解决方案、Dumper-7实战流程以及模型后处理技巧,帮助开发者高效获取游戏资产。

weixin_30872499的博客 424

DSP(数字信号处理器)技术概要

数字信号处理器(digital signal processor,DSP)是一种用于数字信号处理的可编程微处理器,它的诞生与快速发展,使各种数字信号处理算送得以实时实现,为数字信号处理的研究和应用打开了新局面,提供了低成本的实际工作环境和应用平台,推动了新的理论和应用领域的发展。目前,DSP技术在通信、航空、航天。雷达、工业控制、医疗、网络及家用电器等各个领域都得到了广泛应用。 1.1 DSP系统和芯片的结构特点1.1.1 DSP系统的基本结构通过传感数将非电物理量转换为模拟电信号,预处理一般包括放大器和滤

m0_46582485的博客 2万+

Android 6.0 动态权限申请

在Android6.0中,引入了动态申请权限机制。 以前我们在申请权限的时候,都是写在了Manifest.xml里面。 安装的时候会有一堆提示申请权限的界面, Google 可能想到用户可能并不注意这些权限。 so~ 就迎来了 动态权限机制。 请注意,如果你使用了API 23以上, 然而并没有用代码处理权限问题。 那么你的程序将会 CRASH !!! 下面我们来看看到底哪些权限

xuezhe__的博客 2万+

Element-UI全面入门与实战技巧

Element-UI 是一套基于 Vue 2.0 的桌面端组件库,由饿了么前端团队开发并维护。它提供了一系列丰富的 UI 组件,旨在帮助开发者快速构建高效、美观的 Vue 应用程序。Element-UI 是一款遵循 Ant Design 设计规范的 Vue UI 库,它涵盖了从按钮、输入框、选择器到表格、标签、进度条等众多常用的界面元素。Element-UI 的组件不仅功能全面,而且易于定制,使得开发者可以快速实现个性化的页面设计。Element-UI 的特点包括:在使用 Element-UI 之前,需要确

全世界的博客 2864

Android permission 动态申请、授权

Android permission 新特性深度学习本篇文章介绍android permission系统,并介绍android 6.0 permission的新特性,包括权限动态申请和授权等。permission systemAndroid开发者都知道,我们开发的应用默认是没有任何权限的,我们没有办法联网,没有办法进行外部空间存储(内部空间是可以的),除非我们申请了相应的权限(permission

u014088294的专栏 6236

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4698

Graylog日志系统实战:高效接收与解析交换机日志

本文提供Graylog日志系统的实战部署与配置指南,重点讲解如何高效接收与解析交换机日志。通过Docker快速部署,配置Syslog输入,并指导华为、华三等主流交换机将日志发送至Graylog。文章还介绍了使用提取器解析日志字段、创建数据流进行分类,以及设置报警规则,实现从被动排查到主动预警的运维转变,帮助网络工程师构建集中、智能的日志管理系统。

weixin_29284885的博客 541

android 权限自动授权,关于Android 6.0上应用的动态权限授权解决方案!

Android6.0应用在动态授权使用,一般是在首页面的onResume()去判断是否已获取APP所需权限,另一种就是在调用权限前判断;final public static int REQUEST_CODE_READ_PHONE_STATE = 123;final public static int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 125;判断方法:/...

weixin_42510835的博客 831

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2029

android 8.0 动态权限,Android6.0 动态权限机制深入讲解

前言Android6.0以后引入了动态权限机制,一些系统权限的分配需要在app运行中进行分配,而不只是在AndroidManifest中指定。本篇将针对动态权限的底层分配过程进行分析(基于Android-6.0.1)。权限分配我们先看一下请求分配权限的代码//frameworks/support/v4/java/android/support/v4/app/ActivityCompat.javap...

weixin_27127993的博客 785

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android6.0 动态权限机制深入讲解

Android6.0 动态权限机制深入讲解

Android framework 112

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android 5.0 ~ 14访问Android/data(obb)目录的方法

众所周知,安卓每次出新版本的时候都会收紧权限,存储权限也不例外。虽说官方的意思是为了保护隐私安全,但这些改动着实令开发者和用户感到头疼,尤其是Android/data、Android/obb目录的访问。毕竟用户更难操作,开发者也要费力适配。那么今天就来探索下怎么适配这些变更点吧。

gjc91126的博客 5万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

安卓权限机制的变迁

随着用户隐私意识的提升,安卓权限机制不断变革,从最初的粗放到越来越精细化。作为开发者,我们应当顺应变革潮流,及时跟进新特性,提供更安全、更优质的应用体验。动态权限机制沿用至今,成为安卓权限管理的核心机制。安卓11基于分区存储,进一步优化了存储相关权限。安卓操作系统经过多年的发展,其权限管理机制也在不断演进,从早期的静态权限,到如今的动态权限、分区存储等,变化可谓翻天覆地。在安卓4.3及更早版本,安卓采用的是静态权限机制。部分权限被划分为特殊权限,需要用户在设置中手动授予,提高了敏感权限的授予门槛。

宋志辉的博客 949

记Android6.0动态权限处理引发的问题

最近项目上线,有些渠道需要Apk的targetversion设置为26或以上,为此引发一系列的问题记录一下。 Android权限的动态申请 安卓6.0之前的版本,所有权限只要在文件中声明,系统都会默认给权限。安卓6.0以后,如果app的targetversion低于23的,安卓还是会使用旧版本的权限机制。高于23的,安卓会启用新的权限检测机制。那么,完整的权限申请流程是咋样的?下面会列举一下整...

h61022855的专栏 321

Qt for Android 动态申请权限

一.Android 6.0权限机制 在Android 6.0 关在AndroidManifest.xml 静态申请权限不够. 需要运行时,用代码申请才能打开相应权限. 否则只让用户手动在设置找到应用打开相应权限,才能工作.体验非常之差. 比如蓝牙程序在6.0必须有定位权限的才能打开,但是Qt Android的动态申请定位权限请求时灵时不灵,有时运行很长时间均请求. 原生java 动态请求代码很容易,但Qt 需要处理工作 二.解决办法 参考 https://blog.csdn.net/zdc9023/arti

qq_40754866的博客 2215

android申请蓝牙动态权限,Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法...

为提供更高的数据保护 Android6.0版本上增加了关于Wifi和蓝牙的权限。蓝牙搜索到设备需要用到定位服务,所以在开发中 targetSdkVersion 大于等于23(6.0) 需要在代码中进行权限获取需要在配置文件中申请两个权限:在代码中调用时先进行权限判断,如果没有权限就去申请权限:private void requestPermission() {if (Build.VERSION.S...

weixin_39763033的博客 713

Android权限管理

前言农历腊月二十五,年味也愈加浓重了,在新年到来之前争取再多更新几篇博客。此文讲解安卓的权限管理,主要是针对Android 6.0新增加的动态权限获取的使用方法。 两种权限管理什么是权限管理大家也一定都知道,想必不需要笔者多说了,笔者在此只提一下目前的两种权限管理机制: 安装时权限管理: 这是在安卓5.1及以下采用的方案,指的是安装应用完成时,应用可以获得系统权限 运行时权限管理: 安卓6.

吴豪杰 643

Android 6.0动态权限申请详解

//安卓6.0以上读取内存文件需要手动请求权限 public static boolean isGrantExternalRW(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission( Man

Swust_ZzK的博客 891

android6.0 ble 权限问题

在5.0上系统运行ok,把编译版本改成6.0后报下面这个错 Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission... 阿西吧!!!这是问题是6.0系统全新的权限机制导致的[可以参考这篇文章] (http://jij...

chenxiquan5876的博客 409

Android6.0以前及以后的权限设置

今早看了鸿洋大神公众号的一篇关于权限的文章,记录下,方便自己记忆! Android 6.0之后 Android 6.0(API 23)以后加入了权限机制,加入了9组危险权限,包括调用相机,读取联系人信息,读取位置信息,打电话,录音等等,涉及用户隐私的权限。  具体操作是6.0以后,在Manifest中不仅需要注册权限,还需要在调用的时候动态申请权限,让用户知道具体打开了什么权限。在6.0之前只需要...

Happy Coding! 704

安卓动态权限详解

随着安卓的不断升级,手机的权限也逐渐被google收回,在6.0时出现了动态权限。 知识图 由来介绍 安卓6.0之前应用的权限在安装时就可以全部授予(清单文件声明的),然而这可能造成店大欺客的情况,用户为了安装app,必须同意所有的权限。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在运行时根据用户的需要动态授予。这样就不需要在安装时被强迫同意某些权限...

dev晴天的博客 5028

Android 权限调研

前言 截止当前时间,Android版本已经到了O,Android 6.0引入动态权限机制,到目前随着Android 6.0以及以上版本普及,动态申请权限变得越来越重要,也是大多数APP的通用机制,目前我们的APP涉及到的权限也不少,为了得到更好的用户体验,应该在需要权限时,动态申请,还有需要在第一次被拒绝之后能够保证再次申请。 动态申请权限列表 目前危险等级的权限都需要动态申请,正常等级的权限不需...

Must_Do的博客 1318
下一篇: Icon Font在Android中的使用
ZSunlight
博客等级 码龄12年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值