您的位置:首页 > 移动开发 > Android开发

Android 6.0运行时权限管理

2017-08-18 16:12 405 查看
运行时权限管理 定义:

之前我们的App需要权限,只需在
manifest
中申明,用户安装后,一切申明的权限都可使用。

但是
Android 6.0
以后
Android M
把权限管理做了加强处理,除了需要在
manifest
申明,在使用到相关功能时,有些权限还需重新授权方可使用,所以就把这些需要重新授权方可使用的权限称之为运行时权限(
Dangerous Permission
)。而在
manifest
里申请后,可直接使用的权限为普通权限(
Normal Permissions


需要使用运行时权限的条件:

设备运行的是 Android 6.0(API 级别 23),并且应用的
targetSdkVersion
是 23 或更高版本,就会使用运行时权限规则

Normal Permissions :

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令

android.permission.ACCESS_NETWORK_STATE 获取网络信息状态,如当前的网络连接是否有效

android.permission.ACCESS_NOTIFICATION_POLICY

android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息

android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备

android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备

android.permission.BROADCAST_STICKY 允许一个程序广播常用intents

android.permission.CHANGE_NETWORK_STATE 改变网络状态如是否能联网

android.permission.CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态

android.permission.CHANGE_WIFI_STATE 允许程序改变Wi-Fi连接状态

android.permission.DISABLE_KEYGUARD 允许程序禁用键盘锁

android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序

android.permission.GET_PACKAGE_SIZE 允许一个程序获取任何package占用空间容量

android.permission.INTERNET 访问网络连接,可能产生GPRS流量

android.permission.KILL_BACKGROUND_PROCESSES 允许程序调用killBackgroundProcesses(String).方法结束后台进程

android.permission.MODIFY_AUDIO_SETTINGS 修改声音设置信息

android.permission.NFC 允许程序执行NFC近距离通讯操作,用于移动支持

android.permission.READ_SYNC_SETTINGS 读取同步设置,读取Google在线同步设置

android.permission.READ_SYNC_STATS 读取同步状态,获得Google在线同步状态

android.permission.RECEIVE_BOOT_COMPLETED 允许程序开机自动运行

android.permission.REORDER_TASKS 允许程序改变Z轴排列任务

com.android.alarm.permission.SET_ALARM 设置闹铃提醒

android.permission.SET_TIME_ZONE 设置系统时区

android.permission.SET_WALLPAPER 允许程序设置壁纸

android.permission.SET_WALLPAPER_HINTS 允许程序设置壁纸hits

android.permission.VIBRATE 允许振动

android.permission.WAKE_LOCK 允许程序
4000
在手机屏幕关闭后后台进程仍然运行

android.permission.WRITE_SYNC_SETTINGS 允许程序写入同步设置

Dangerous Permission:

group:android.permission-group.CONTACTS

permission : android.permission.WRITE_CONTACTS 写入联系人,但不可读取

permission : android.permission.GET_ACCOUNTS 访问GMail账户列表

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 允许程序使用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 通过GPS芯片接收卫星的定位信息,定位精度达10米以内

permission : android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米

group:android.permission-group.STORAGE

permission : android.permission.READ_EXTERNAL_STORAGE

permission : android.permission.WRITE_EXTERNAL_STORAGE 允许程序写入外部存储,如SD卡上写文件

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 接收WAP PUSH信息

permission : android.permission.RECEIVE_MMS 接收彩信

permission : android.permission.RECEIVE_SMS 接收短信

permission : android.permission.SEND_SMS 发送短信

总结:分组对权限机制的影响

如果app运行在android 6.0的机器上,如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。

demo:假如app对READ_CONTACTS已经授权了,当申请WRITE_CONTACTS权限时,系统会直接授权通过。

权限列表

Android 权限列表,可参照以下资料参考一参考二参考三

申请运行权限步骤:

AndroidManifest
声明使用权限

<uses-permission android:name="android.permission.CALL_PHONE"/>


在使用时,判断是否为Android 6.0以上,返回false则不需要申请,返回true,则需要申请权限

private boolean isMarshmallow() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}


检查权限

String permission = Manifest.permission.CALL_PHONE;

if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {

//TODO 未授权

} else {

//TODO 已授权

}


ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED(代表此权限已允许)。

申请权限

String permission = Manifest.permission.CALL_PHONE;
int requestCode = 1;

if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {

//申请授权
ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);

} else {

//直接执行操作
}


另外,在申请权限的时候,还需要注意一个函数:

if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {

} else {
ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
}


shouldShowRequestPermissionRationale


如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。

如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false

处理权限申请回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

if (requestCode == this.requestCode) {

if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限申请成功,执行操作

} else {
// 权限申请失败
Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}


总结:网上也有很多已经封装好的关于申请权限的,可以参照以下网址内容

http://jcodecraeer.com/plus/list.php?tid=31&keyword=%C8%A8%CF%DE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: