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

关于Android 6.0运行时权限的一些理解和权限处理的三方库的应用

2017-03-30 13:16 567 查看
运行时权限:就是在手机运行中需要运用到什么权限就去申请授权什么权限;

这个是从Android 6.0出来的,在以往的Android版本里,权限只是在第一次安装的时候一次性全部授权,这就导致很多app一次申请n多个权限,私下里偷偷不知道在你手机里干什么,说不定你的艳照就被被人获取到了,基于这些个安全的考虑,所以推出了运行时权限这一说

当然,也不是所有权限都需要在运行的时候去申请授权,有些不涉及到隐私等常用的权限就不需要去动态授权了,所以新的权限策略就把权限分为了普通权限和危险权限;

普通权限:这类权限还是只需要在manifast去声明就行了,在app安装的时候直接授权,不需要去检测它们是否授权,以下就是普通权限:

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


危险权限:APP运行在Android 6.0 (API level 23)或以上的设备中,并且你的Android Studio的app下的build.gradle里面的targetSdkVersion>=23时


此时系统就会采取新的运行时权限策略了,需要危险权限的时候,如果没有做相应的处理app就会崩溃,这tm事情就大了!以下就是危险权限:

CALENDAR(日历)
READ_CALENDAR
WRITE_CALENDAR
CAMERA(相机)
CAMERA
CONTACTS(联系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE(麦克风)
RECORD_AUDIO
PHONE(手机)
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS(传感器)
BODY_SENSORS
SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE(存储卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE


当你需要使用危险权限的时候你就需要注意了:

1.这些个权限你还是需要在manifast里面去申明

2.同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。(从上面的危险权限中可以看出他们有时候是组队出现的)

3.申请权限的弹出框是组队出现的,例如我申请READ_EXTERNAL_STORAGE,系统会提示”允许xxx访问设备上的照片、媒体内容和文件吗?”。

4.如果app运行在Android 6.0及以上,但是你的Android Studio targetSdkVersion<23时,系统还是会按照老的权限策略去执行,即还是在安装的时候去申请所有权限。

具体的实现步骤

1.你需要的危险权限在manifast里面申明,如下:

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


2.在你需要用到这个权限的地方去检测用户是否授权过这个权限,具体如下:

/**
* 检查用户是否授权 CALL_PHONE 这个权限
* PackageManager.PERMISSION_GRANTED   表示用户已经授权
* PackageManager.PERMISSION_DENIED    表示用户已经拒绝或者还没有授权
*/
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
//表示用户已经授权该权限,接下来你想干嘛就干嘛了

} else {
//表示还没授权,没有授权那就去申请啦
todoRequestPermission();

}


3,如果没有授权就有这一步,没有就要去申请了,具体申请如下:

/**
* 用来申请 Manifest.permission.CALL_PHONE 这个权限的
*/
private void todoRequestPermission() {
/**
*  需要3个参数
*  1,Activity
*  2,申请权限的permissions数组,可以一次申请好几个权限,全部写在数组里面
*  3,请求码,用来区分是谁请求的,是哪个权限数组请求的
*/
String[] permissions = {Manifest.permission.CALL_PHONE};
int requestCode = 1;
ActivityCompat.requestPermissions(MainActivity.this,permissions,requestCode);
}


4,用户到底是授权了还是拒绝了呢?这里就需要重写onRequestPermissionsResult方法,在此方法里面去获取了,具体如下:

/**
*
* @param requestCode  这个requestCode就是我们申请的时候填写的那货,不清楚请看上一步
* @param permissions  这个就是你申请的时候的权限数组,请看上一步
* @param grantResults  这个是你申请权限返回的授权结果,如果你申请了13个权限,那么这个里面就有13个结果
*                      同意PackageManager.PERMISSION_GRANTED,拒绝PackageManager.PERMISSION_DENIED
*                      换句话说,就是放的这2货,和申请的权限数组是一一对应的
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
/*
先判断一下这个申请结果数组的长度,我感觉判不判断都无所谓,因为只有你申请了权限,才会回掉这个方法
既然申请了,grantResults数组就不应该为空的 ,但是我看android大佬们都判断了,我一菜逼不判断,感觉
要被鄙视的节奏
*/
if (grantResults.length>0) {
//判断第一个请求结果是啥,同意:PERMISSION_GRANTED,拒绝:PERMISSION_DENIED
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
//拒绝了,你是个好人,我们不合适

} else {
//同意了,可以去如家了,嘿嘿嘿~~~

}
}
break;

}
}


相比自己写,我还是更愿意用别人封装好的,嘿嘿嘿,下面介绍2个大佬封装好的拿来用

1,PermissionGen

github地址:https://github.com/lovedise/PermissionGen

用法

0,添加依赖:compile ‘com.lovedise:permissiongen:0.0.6’

1,在manifast里面去申明

2,在需要用到的地方申请

PermissionGen.with(MainActivity.this)
.addRequestCode(100)
.permissions(
Manifest.permission.READ_CONTACTS,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.WRITE_CONTACTS)
.request();


或者一个:

PermissionGen.needPermission(this, 100, Manifest.permission.CAMERA);


3,重写onRequestPermissionsResult

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}


4,处理授权和拒绝了,注解上面的requsetCode一定要是你申请的时候写的

@PermissionSuccess(requestCode = 100)
public void test() {
//授权了
}

@PermissionFail(requestCode = 100)
private void test2() {
//拒绝了
}


是不是感觉还是很麻烦啊,我也觉得,下面来一个更简单的

2,RxPermissions

github地址:https://github.com/tbruyelle/RxPermissions
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 权限