文档章节

android 6.0权限管理

c
 cold19
发布于 2017/08/29 13:27
字数 946
阅读 33
收藏 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 6.0 创建文件夹失败问题

华为P9是android 6.0 的== 在API23+以上也就是安卓6.0以上的,进行了权限管理 不止要在AndroidManifest.xml里面添加权限 ` `

Nobodyhi
2017/01/17
1
0
Android 6.0 将在下周开始推送,大量新特性

Google 在昨晚的新品发布会上确认 Android 6.0 将在下周开始推送,预计是 10 月 5 日。Android 6.0,也就是 Android Marshmallow,拥有更好的相机功能,电池功能,改进了指纹传感器,Android...

oschina
2015/09/30
6.9K
48
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
Android 6.0 SDK & 最终 Android M 预览版发布

Google 在 5 月 Google I/O 上发布了 Android M 开发者预览版,今天终于发布了 Android M 最终的开发者预览版,同时还引入了官方 Android 6.0 SDK,在 Google Play 开放下载,提供 Android ...

oschina
2015/08/18
17.9K
54

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
3
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部