运行时权限管理 定义:
之前我们的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 允许程序在手机屏幕关闭后后台进程仍然运行
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