android 6.0 动态权限

Android 6.0动态权限介绍与处理 一、Android 6.0权限介绍从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 Android 6.0系统6.0以前,所有的权限,访问网络的权限,读取SD卡的权限,访问通讯录,拨打电话的权限都在安装的时候系统授予了要安装的应用。在系统运行的时候不需要对权限做任何的处理。用户在安装的时候一般都不知道这些权限用在了什么地方,这样做很不安 阅读详情

从简书上看到的,自己写了一下学习下,原链接在最后

作者:李晨玮

链接:http://www.jianshu.com/p/a37f4827079a

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

权限的分组

在Android6.0(M)之后,对权限进行了分类,大致有这三种:

  • 普通权限
  • 危险权限
  • 特殊权限
普通权限

也就是正常权限,是对手机的一些正常操作,对用户的隐私没有太大影响的权限,比如手机的震动,网络访问,蓝牙等权限,这些权限会在应用被安装的时候默认授予,用户不能拒绝,也不能取消。

普通权限列表:

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

对于上面这些权限,需要和Android6.0(M)之前的系统,在AndroidManifest.xml声明即可。

危险权限

其实就是运行中需要处理的权限,也是我们最需要注意的权限,这些权限会关系到用户的隐私或影响到其他应用的运行,这些危险权限,谷歌还做了一个权限组,以分组的形式来呈现:

由于运行权限机制的出现,变得我们需要对新开发的应用去做适配,当然有人会问,那我之前开发的老应用不就完蛋了,是不是运行到6.0系统上就会发生各种崩溃?

其实不会的,谷歌做了良好的适配:
当你的应用targetSdkVersion小于23的时候,就算你运行在Android6.0系统上,它也会默认采用以前的权限管理机制,也就是一刀切。当你的targetSdkVersion大于等于23的时候且在Andorid6.0(M)系统上,它才会采用新的这套权限管理机制。

所以如果你想逃开这个“麻烦”,只要把targetSdkVersion的版本设置为低于23就可以了,不过不建议采用这种方案,该来的总是要来的,随着国产手机ROM的更新,比如小米,华为等也开始有部分机型进行了系统升级,所以这是种趋势。

说了这么多,那么来看下怎么进行Android6.0(M)的权限管理适配吧,其实很简单,只需要记住下面几个API方法就可以:(API23之后提供)

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

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

void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 请求权限结果回调

public void request(View view) {
    //判断当前系统是否高于或等于6.0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        //当前系统大于等于6.0
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){
            //具有拍照权限,拍照

        }else {
            //没有拍照权限,需要进行动态申请
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},REQUEST_PERMISSION_CAMERA_CODE);
        }
    }else{
        //小于6.0  直接调用拍照

    }
}

1.这里PERMISSION_GRANTED表示具有权限,PERMISSION_DENIED表示无权限

2.在判断应用没有相关权限的后,我们通过requestPermissions进行权限申请,这里的 String[] permissions是个字符串数组,可以对多个权限进行申请

3.REQUEST_PERMISSION_CAMERA_CODE是个标识码,类似Intent跳转的REQUEST_CODE的,然后我们就可以在onRequestPermissionsResult进行权限申请的回调处理:

上面的那张图,有的朋友应该已经留意到了有个不再提醒的勾选框,如果用户勾选了不再提醒,然后把你拒绝了,那你的应用就GG了,其实这里还有一个API方法:

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (grantResults.length >= 1) {
        int cameraResult = grantResults[0];//相机权限

        boolean cameraGranted = cameraResult == PackageManager.PERMISSION_GRANTED;
        if (cameraGranted) {
            //具有相机权限,调用相机
            Log.d("MainActivity", "申请相机权限成功");
        } else {
            //不具有相关权限,给予用户提醒,比如Toast或者对话框,让用户去系统设置-应用管理里把相关权限开启
            Log.d("MainActivity", "没有相关权限");
            if (!shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
                //如果用户勾选了不再提醒,则返回false
                //给予用户提醒,比如Toast或者对话框,让用户去系统设置-应用管理里把相关权限打开
                Log.d("MainActivity", "选择不再提醒");
            }

        }
    }
}

当用户勾选了不再提醒的框并把你拒之门外了,这个方法的返回值是true,它可以帮助你再一次的提醒用户,你需要这个权限,也是你最后翻身的方法了,哈哈,要坦诚噢~
但是在实际开发中,不得不说的一个坑,由于国内第三方ROM对系统改造的太严重,比如小米,亲测有些机型的这个方法是不起作用的,永远的是返回false,这个时候该怎么办,就要另外想解决方案了。

还有需要注意的一点是上面的权限分组,比如读写文件权限:

WRITE_EXTERNAL_STORAGE
READ_EXTERNAL_STORAGE

它们是属于同一个权限组的,你如果拿到了他们其中的一个权限,那么也同时会有另一个权限,同理,如果你拿到读取通讯录的权限,那么你同时也会拥有写入通讯录的权限,这样就避免了我们在申请相关权限的时候需要些老长老长的权限代码了。

特殊权限

特殊权限,比如:
系统级别对话框:SYSTEM_ALERT_WINDOW
修改系统设置:WRITE_SETTINGS
这2个特殊权限,我们需要在startActivityForResult里调用即可,这2个权限一般是不会用到,会用到的地方要么是黑科技或者是反用户体验的场景,这里就不再做过多描述,有兴趣的朋友自己探索吧。

这里需要另外提到的一个权限:READ_PHONE_STATE
我们可以通过这个权限来获取机器的唯一标识码,很多第三方统计是基于这个标识码来完成统计的,但是在我们应用一开始运行的时候,这个运行权限我们是没有的,在Application里我们也不能对权限进行获取,所以这点也需要我们去注意。

最后

对于一些比较特别的权限,比如文件的读写权限,一般在我们第一次开启APP的时候就要去获取了,假设我们一开始没有获取到这个权限,那么如果我的首页有轮播广告图,这个广告图是网络获取的,做了三级缓存,这样就会到导致磁盘缓存无法写入。这边提供一个解决方法,就是在你引导APP启动的时候,就引导用户去获取权限,当用户拒绝的时候,应该给出弹出框并跳转对应的应用权限管理界面(需要对不同机型进行设置)。

可以参考微信的做法:

启动app,在闪屏页的时候向用户提出权限的申请 
存储空间权限,关闭微信
电话权限,关闭微信
位置权限,关闭微信

进入app:
发照片时,申请照片权限
发语音时,申请麦克风权限
用户每次点击拒绝,都弹出自定义对话框,提示用户设置权限
关于android6.0动态权限造成的app crash问题 今天我们为公司内部员工开发的app出现了一个bug,因为我们的app要绑定imei所以我就读取imei并且有个权限READ_PHONE_STATE就是这个权限出现了问题,我就纳闷了怎么会有问题呢,我已经在manifest上声明了,然后我就看一下他的android版本6.0(什么时候国产手机系统跟进竟然这么快了!),我就去搜了一些相关资料才发现是android6.0涉及到隐私的权限是动态的,也就是说 阅读详情

相关推荐

最优化方法 25:PDHG

前面的章节要么从原始问题出发,要么从对偶问题出发,通过求解近似点或者一个子优化问题进行迭代,而且推导过程中我们发现根据问题的参数特征,比如矩阵 AAA 是瘦高型的还是矮胖型的,采用对偶和原始问题的复杂度会不一样,可以选择一个更简单的。而这一节,我们将要从原始对偶问题出发来优化,什么是原始对偶问题呢?就是原始优化变量和对偶优化变量(原始函数和共轭函数)混合在一块,看下面的原理就知道了。 1. 原始对偶问题 现在考虑原始优化问题,其中 f,gf,gf,g 为闭凸函数 min⁡f(x)+g(Ax) \min \q

Glooow的博客 4599

Android 插件化

什么是插件化 占位式插件化 宿主App无法直接加载插件apk的Activity,因此需要一个代理的Activity,所以称之为占位式插件化。

随风的博客 545

Homebrew 必备软件清单:我的 macOS 开发环境搭建全记录

本文详细介绍了如何使用Homebrew在macOS上搭建高效的开发环境,包括基础配置、核心开发工具链、高效编码工具集等30个必备工具。通过Homebrew这一macOS缺失的包管理器,开发者可以一键安装命令行工具和GUI应用,大幅提升工作效率。文章还提供了日常维护命令和疑难问题解决方案,适合从新手到资深开发者的所有用户。

weixin_28836507的博客 353

Android静态代码检查

准备环境 1、  安装SDK 此处忽略 2、  安装gradle 1)、下载: 从http://gradle.org/gradle-download/中下载gradle 2)、存放到本地 把下载的gradle文件存放到本地,例如:D:\Program Files\gradle-2.8 3)、配置环境变量 在path中加入gradle地址

雷亚的博客 1792

RK3566添加ffpeg【Buildroot系统】

有很多人都发现了RK3566系列的芯片是不可以直接使用ffmpeg官网源码的!会报错: Not a video capture device. /dev/video0: No such device 接下来我们就来解决这个问题!!

honmy18的博客 4068

EduCoder 计算机网络实验 IP协议分析

第1关:跟踪抓包 任务描述 相关知识 IPV4数据包 截获数据报 分析截获结果 使用git将本地文件推送到远程仓库永久保存 操作要求 任务描述 本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。 相关知识 为了完成本关任务,你需要掌握: 截获数据报; 简单分析数据包格式。 IPV4数据包 网际协议第 4 版(Internet Protocol version 4

qq_41975868的博客 1万+

Android Lint规则大全(翻译)

Lint规则 lint规则包含一下几个分类 1、Correctness正确性方面 2、CorrectnessMessages更正信息方面 3、Security安全性方面 4、Performance性能方面 5、UsabilityTypography更好的可用性方面 6、UsabilityIconsIcon的更好的可用性方面 7、Usability可用性方面 8、Accessibility可访问性方面 9、Internationalization国际化方面

cplasf2012的博客 2152

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3866

Android插件化的实现(1)--占位式(插桩式)插件化的实现

什么是插件化? 插件化出现的主要原因,我个人认为是解决了越来越大的庞大的APK的体积,用户在下载一个APK的时候,只需要将主要的功能打包到APK中,当用户要使用某些不常用的功能的时候,我们就使用动态下载APK的方式,供用户使用,其实这就是插件化的技术。其实通俗的讲,就是一个运行的APP(宿主),去加载没有安装运行的APK文件,可以使用该APK文件里面的功能。如下图所示。 占位...

做一个苦行僧的专栏 627

29、Power BI 中行级安全(RLS)的实现与应用

本文详细介绍了在Power BI中实现行级安全(RLS)的方法,包括静态RLS和动态RLS的实现流程、适用场景及对比分析。通过具体业务场景,展示了如何创建安全角色、定义规则、验证角色、发布模型以及分配成员。此外,还探讨了更复杂的动态RLS场景,如基于父子层次结构的数据访问控制和从外部源获取用户信息的实现方式。文章最后总结了最佳实践建议及未来发展趋势,为企业在Power BI中高效、安全地实施数据访问控制提供了全面指导。

terraform7cloud的博客 195

华为od 面试八股文_C++_02_含答案

华为od 面试八股文_C++_02_含答案

MISAYAONE的博客 3120

第三天(组件化,插件化,模块化是什么,有什么区别)

组件化与插件化相同之处: 是将一个APP拆分为多个模块去开发. 插件化: 如果我们把一个APP分为多个模块来开发的化,我们最终打包的时候永远只需要打包当前的主apk就可以,其它的功能模块可以不管,它们可以当作是一个独立的apk来单独运行,甚至单独发布,单独给用户用.当我们项目达到一定体积时,一般都会用插件化开发 不仅仅是apk也可以是libralaly(dex) 好处: 1,提高编译速度,节...

qq_35651451的博客 772

3D医学影像开发入门<一>:VS2019+DCMTK3.6.8编译及环境配置

3D医学影像开发入门:VS2019+DCMTK3.6.8编译及环境配置

欧特GO 1303

android 6.0 动态申请权限,安卓6.0动态申请权限遇到了一个错误

事情是这样的,小白写了一个简单的记事本程序,就是简单的读写一下文本文件的,但是呢在测试的时候出现了一些问题,在我的7.0的真机,以及AS8.0的模拟器上程序都是没有问题的,甚至我拿安卓4.4的模拟器测试也是没有问题的,但是就是在6.0的系统上怎么测试都不行,报出以下错误 Before Android 4.1, method android.graphics.PorterDuffColorFilte...

weixin_39896617的博客 273

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_39766867的博客 200

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android权限篇 【Android 6.0】动态权限申请

一、前言 Android6.0之前只需在AndroidManifest.xml文件写明权限即可 Android 6.0 版本之后【SDK >= 23】,一些隐私权限需要动态申请,而且在用户同意授权之后App才能拥有该权限。 二、处理思路 在每个Activity界面显示前把该界面所需的权限全部申请允许了,再进入正常的流程。如果有权限未被允许,开发者可以在接口中自己处理,可以直接提示并退出,或者提示权限的作用后重新发起权限申请。或者提供浏览的界面,Android10之后,谷歌官方不允许用户拒绝权限后,

圈池 2595

Android动态赋权限,安卓6.0以上动态添加权限超简单模板

今天又是“咔嚓”、“窟窿”、“轰隆”,不晓得哪位大仙在渡劫。真的是风生水起,虎虎生威!!!言归正传:描述:最近做了从服务器下载apk到手机内存,然后安装打开以及 从服务器下载pdf文件直接打开浏览2个小功能。问题:权限问题(安卓6.0以上直接在AndroidManifest.xml添加权限没用,必须要动态获取权限)具体代码里遇到的问题:1.Pk文件或者pdf文件没有下载到手机里面,最后查找原因,是...

weixin_34283265的博客 240

安卓6.0以上动态权限申请封装

安卓在6.0之前所有权限只需要在AndroidManifest.xml配置好即可,但是安卓6.0之后就需要使用动态权限了,必须用户自己点击了同意后才会拥有这个权限。下面是别人封装的一个权限工具类。 package com.example.update_next; import android.app.Activity; import android.content.DialogInterfa...

hongfeng8023的博客 388

Android6.0动态权限申请

在Android6.0之前只需在AndroidManifest.xml文件写明权限即可。但是在Android6.0之后也就是SDK>=23的时候,一些隐私权限需要动态申请,而且在用户同意授权之后App才能拥有该权限。 如下9组权限需要动态申请。而且一组权限只要一个授权授权同意,全组都可用。   group:android.permission-group.CONTACTS     permi

lhp15575865420的博客 7651

安卓开发——Android6.0动态权限申请步骤以及需要注意的一些坑

因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo。算是自己的笔记吧,可能会比较混乱,主要是方便以后查看。后期有别的问题,随时更新~ 本demo github下载地址!!! Google提供的demo的下载地址 6.0权限的基本知识,以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用

萌鼠喝酸奶的博客 8816

Android6.0写入存储动态申请权限

由于安卓6.0的限制,特殊权限在AndroidManifest文件中设置不起效果,需要在代码中动态设置。下面的代码是用于申请访问或写入存储的权限,如下图.需要在AndroidManifest文件中配置权限。(必须) <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>如果是请求拍照摄像头的...

qq_38373150的博客 5164

Unity动态获取安卓权限(Android6.0以上可用)

AndroidManifest.xml文件中需要在Application节点内加入下边这行,目的是关闭权限申请弹窗 <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" /> manifest文件中还需要加入你需要获取的权限(如果不加入,无法动态获取) <uses-permission android:name="android.permission.MODI.

LSC112的博客 1141

Android6.0以后的动态申请权限

由于考虑到安全问题,安卓6.0以后,有些权限是需要动态申请的: if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) A...

weixin_33976072的博客 100

Android6.0之后动态权限申请方法

Android6.0之后动态权限申请 Android 6.0之前,权限在AndroidManifest.xml文件中声明即可。Android 6.0之后把权限分成正常权限和危险权限,AndroidManifest中声明的正常权限系统会自动授予,而危险权限则需要在使用的时候用户明确授予。 静态申请 AndroidManifest.xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> &l

特立独行的博客 1518

重点:安卓6.0以后动态获取权限

安卓6.0以后动态获取权限 1. 如何查看手机安卓版本2.效果图3.代码流程:(1)在AndroidManifest.xml中添加所需权限(2)封装了一个checkPermisson方法来动态检查和申请权限,自己封装的(3)重写onRequestPermissionsResult方法根据用户的不同选择做出响应,该方法重写的2.隐式意图:一.使用隐式意图调用拍照/图库/摄像机1.使用隐式意图调用系统...

qq_34178710的博客 1613
上一篇: View学习(三)--颜色
下一篇: String.format()方法
missingcall
博客等级 码龄10年 8粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值