文档章节

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 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
Android位置权限以及数组寻找索引的坑

填坑与求解惑来的。 一、Android 危险权限,来自官方文档的坑??? Android开发者都知道,Android 6.0 之前,权限申请只需要在 AndroidManifest.xml 文件中声明就可以。Android 6.0 开始,权...

SharpCJ
07/26
0
0
android8.0如何打开修改系统设置WRITE_SETTINGS权限?

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

sunnymsg
06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
42分钟前
1
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
今天
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
今天
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
今天
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部