文档章节

android 6.0权限管理

c
 cold19
发布于 2017/08/29 13:27
字数 946
阅读 33
收藏 0
点赞 0
评论 0

1.     简介

android 6.0以前,用户安装app是一次性列出需要的权限,询问用户是否安装,只有当用户同意了之后,app才会安装。

而android6.0(API 级别 23)开始,app可以直接安装,当app在运行时候需要用的权限是会弹出系统对话框逐个询问用户是否授予,当使用到了相对比较敏感的权限时,用户可以拒绝,这就是android运行时权限处理的基本策略。

新的android运行时权限策略将android系统的权限分为两大类,一类不涉及用户隐私,这种权限只需要在AndroidManifest.xml中设置即可,另一类涉及用户的隐私内容,这一类需要在AndroidManifest.xml中设置,并且需要用户确认才会被授予。

2.     不需要运行时申请的权限

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

3.     需要运行时申请的权限

这些权限同样需要AndroidManifest.xml中设置,如果没有设置,则直接回调开发者权限拒绝。这些权限还有一个组的概念,同一个组的包含若干权限,某一个权限被授予,则同一组的其他权限也会被授予。这些权限包括:

group:com.google.android.gms.permission.CAR_INFORMATION

  permission:com.google.android.gms.permission.CAR_VENDOR_EXTENSION

  permission:com.google.android.gms.permission.CAR_MILEAGE

  permission:com.google.android.gms.permission.CAR_FUEL



group:android.permission-group.CONTACTS

  permission:android.permission.WRITE_CONTACTS

  permission:android.permission.GET_ACCOUNTS

  permission:android.permission.READ_CONTACTS



group:android.permission-group.PHONE

  permission:android.permission.READ_CALL_LOG

  permission:android.permission.READ_PHONE_STATE

  permission:android.permission.CALL_PHONE

  permission:android.permission.WRITE_CALL_LOG

  permission:android.permission.USE_SIP

  permission:android.permission.PROCESS_OUTGOING_CALLS

  permission:com.android.voicemail.permission.ADD_VOICEMAIL



group:android.permission-group.CALENDAR

  permission:android.permission.READ_CALENDAR

  permission:android.permission.WRITE_CALENDAR



group:android.permission-group.CAMERA

  permission:android.permission.CAMERA



group:android.permission-group.SENSORS

  permission:android.permission.BODY_SENSORS



group:android.permission-group.LOCATION

  permission:android.permission.ACCESS_FINE_LOCATION

  permission:com.google.android.gms.permission.CAR_SPEED

  permission:android.permission.ACCESS_COARSE_LOCATION



group:android.permission-group.STORAGE

  permission:android.permission.READ_EXTERNAL_STORAGE

  permission:android.permission.WRITE_EXTERNAL_STORAGE



group:android.permission-group.MICROPHONE

  permission:android.permission.RECORD_AUDIO



group:android.permission-group.SMS

  permission:android.permission.READ_SMS

  permission:android.permission.RECEIVE_WAP_PUSH

  permission:android.permission.RECEIVE_MMS

  permission:android.permission.RECEIVE_SMS

  permission:android.permission.SEND_SMS

  permission:android.permission.READ_CELL_BROADCASTS



ungrouped:

  permission:com.huawei.pushagent.permission.RICHMEDIA_PROVIDER

  permission:com.huawei.motion.permission.MOTION_EX

  permission:com.huawei.contacts.permission.CHOOSE_SUBSCRIPTION

4.     动态运行权限的使用步骤

1.检查权限

/**
 * 1.检查权限
 * @param
 * @return 权限是否允许标志
 */
private boolean checkPermissions(String[] permissions) {
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

2.动态请求权限

/**
 * 2.如果没有权限,动态请求权限
 * @param
 * @return void
 */
private void requestPermission(String[] permissions) {
    ActivityCompat.requestPermissions(this, permissions, PERMISSIONS_CODE);
}

3.处理权限返回结果

/**
 * 3.处理返回结果
 * @param grantResults 返回对应权限请求数组,如果成功,则为PERMISSION_GRANTED,否则是PERMISSION_DENIED
 * @return void
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSIONS_CODE) {
        boolean grantedFlag = true;
        // 判断是否所有的权限都已经授予了
        for (int grant : grantResults) {
            if (grant != PackageManager.PERMISSION_GRANTED) {
                grantedFlag = false;
                break;
            }
        }

        if (!grantedFlag) {
            guideUserSetting();
        }
    }
}

这个方法permissions参数是请求权限的数据,grantResults是权限请求结果数组,与permissions数组对应,它有两个值需要了解,PERMISSION_GRANTED表示权限通过,对应值是1,PERMISSION_DENIED表示权限被拒绝,对应值是-1.

4.如果权限请求有没有通过的,则弹出对话框提示用户设置,点击对话框按钮可以跳转到设置权限的界面。

/**
 * 4.如果失败,提示用户自己设置
 * @param
 * @return void
 */
private void guideUserSetting() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("备份通讯录需要访问 “通讯录” 和 “外部存储器”,请到 “应用信息 -> 权限” 中授予!");
    builder.setPositiveButton("去手动授权", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            isShowGuide = true;
        }
    });
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();
        }
    });
    builder.show();
}

自己在最后总结写了个demo,参考了网上实现的例子,测试没有问题。

最后附上简单的2张效果图

源码

 

© 著作权归作者所有

共有 人打赏支持
c
粉丝 0
博文 6
码字总数 4103
作品 0
广州
Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)

一、前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新版本app。在线更新分为以下几个步骤: 在线更新就上面几个步骤,前2步比较简...

codeGoogle
04/28
0
0
安卓应用安全指南 5.2.1 权限和保护级别 示例代码

5.2.1 权限和保护级别 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.2.1.1 如何使用 Android OS 的系统权限 Android 操作...

apachecn_飞龙
04/01
0
0
React-Native之Android(6.0及以上)权限申请

为什么Android要申请权限 简单说下在Android6.0及6.0以上一些google认为涉及“危险和用户隐私”的一些权限不仅要做清单文件(android/app/src/AndroidMainfest.xml)里面申请,还有单独调用api...

mochixuan
2017/11/16
0
0
android8.0如何打开修改系统设置WRITE_SETTINGS权限?

安卓8.0,用如下代码更改系统设置权限,弹出来的界面一直是灰的,不能启用开关。 安卓6.0中,在manifest.cml中声明CHANGENETWORKSTATE权限时,更改系统设置可以生效,否则也一样是灰色界面。...

sunnymsg
06/19
0
0
Android 6.0 中动态获取权限

Android 5.0时代,用户可以在设置选项中对每个授权许可进行开启/关闭 Android 6.0 Marshmallow中,在首次打开、使用过程中实际用到哪些权限才会向收到申请授权的提醒,和现在的iOS非常相像。...

Angels_安杰
2015/11/03
0
0
Google 发布 2018 年强硬新政策,开发者不容忽视!

1. 背景 从 Android 6.0 开始,Google 开始逐渐收紧 Android 平台的开放性,并在进一步提升应用的安全性、性能以及隐私保护方面做出了许多努力。这一点,从 Google 在之后的 Android 7.0 和 ...

伯特
07/02
0
0
Android开发:使用AutoInputAuthCode快速实现自动填写验证码

前言 该类库的实现原理:《Android开发:实现APP自动填写注册验证码功能》。感兴趣的可以看下。 项目地址:github.com/xiong-it/Au…,欢迎star/fork,或者issue,pr。 本文原创作者:MichaelX...

MichaelX
昨天
0
0
android开发-杂篇,暂时保存以后整理

1 2 # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (classFileParser.cpp:3494), pid=7480, tid=7376 # Error: ShouldNotReachHere() # # JRE ......

花花兽
2013/04/12
0
0
Android TrafficStats流量监控

一、流量监控TrafficStats 对于Android流量统计来说在2.2版中新加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。android.net...

IamOkay
2014/11/14
0
0
Android Flutter实践内存初探

闲鱼技术-匠修 我们想使用Flutter来统一移动App开发并做了一些实践。移动设备上的资源有限,通常内存使用都是一个我们日常开发中十分关注的问题。那么,Flutter是如何使用内存,又会对Nativ...

迷你芊宝宝
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部