上篇介绍了事件总线系列框架(http://blog.csdn.net/siwenyy/article/details/75041216),接下来讲讲大家关注的权限问题。
在Android开发中,我们应该遇到过安装app到6.0系统的手机上应用突然一闪而过,查看log,导致崩溃的原因java.lang.SecurityException: Permission Denial。接下来就讲讲6.0权限适配问题。
一、权限分类
普通权限:只需要在AndroidManifest.xml中简单声明这些权限就好,安装时就授权。不需要每次使用时都检查权限,而且用户不能取消以上授权。
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_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
危险权限:所有危险的Android系统权限属于权限组,如果APP运行在Android 6.0 (API level 23)或者更高级别的设备中,而且targetSdkVersion>=23时,系统将会自动采用动态权限管理策略,如果你在涉及到特殊权限
操作时没有做动态权限的申请将会导致App崩溃。
注意事项:
1、必须也在Manifest中申明,否则申请时不提使用用户,直接回调开发者权限被拒绝。
2、同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。
3、申请某一个权限的时候系统弹出的Dialog是对整个权限组的说明,而不是单个权限。
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 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获取定位权限
permission:android.permission.ACCESS_COARSE_LOCATION 通过WiFi和移动基站获取定位权限
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 接收wap push信息
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS 接收短信
permission:android.permission.SEND_SMS 发送短信
permission:android.permission.READ_CELL_BROADCASTS 获取小区广播
并非所有的权限都需要动态申请,Android6.0将权限分为两种,普通权限跟敏感(危险)权限,普通权限是不需要动态申请的,但是敏感权限需要动态申请。
3、怎样动态适配权限
对于敏感权限的适配有一个原则,那就是实时检查,因为权限随时可能被回收,比如用户可以在设置里面把权限给取消,但是APP并不一定知道,因此每次都需要检查,一旦没有,就需要请求,之后,根据返回结果处理后续逻辑。
三、简单使用
以打电话为例
package com.xiaolajiao.linkdemo.permissiondemo;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;