对于Android开发来说,经常需要申请权限,Android6.0以前,所有权限的配置只需要在配置文件AndroidManifest.xml中编写权限配置就可以了,但Android6.0以后版本中,Google为了提高系统的安全性,当APP需要用到用户隐私权限时需要进行权限配置,除了在配置文件AndroidManifest.xml中编写权限配置之外,还需要手动进行权限适配。申请权限的方式有以下两种:
①、在配置文件AndroidManifest.xml中编写权限配置
②、在逻辑代码中动态申请权限授权
Android权限可以分为两大类:普通权限和高级权限。
一、普通权限
常见的普通权限如下所示。
1 ACCESS_LOCATION_EXTRA_COMMANDS 定位权限
2 ACCESS_NETWORK_STATE 网络状态权限
3 ACCESS_NOTIFICATION_POLICY 通知 APP通知显示在状态栏
4 ACCESS_WIFI_STATE WiFi 状态权限
5 BLUETOOTH 使用蓝牙权限
6 BLUETOOTH_ADMIN 控制蓝牙开关
7 BROADCAST_STICKY 粘性广播
8 CHANGE_NETWORK_STATE 改变网络状态
9 CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态,应该是控制手机热点(猜测)
10 CHANGE_WIFI_STATE 控制WiFi开关,改变WiFi状态
11 DISABLE_KEYGUARD 改变键盘为不可用
12 EXPAND_STATUS_BAR 扩展bar的状态
13 GET_PACKAGE_SIZE 获取应用安装包大小
14 INTERNET 网络权限
15 KILL_BACKGROUND_PROCESSES 杀死后台进程
16 MODIFY_AUDIO_SETTINGS 改变音频输出设置
17 NFC 支付
18 READ_SYNC_SETTINGS 获取手机设置信息
19 READ_SYNC_STATS 数据统计
20 RECEIVE_BOOT_COMPLETED 监听启动广播
21 REORDER_TASKS 创建新栈
22 REQUEST_INSTALL_PACKAGES 安装应用程序
23 SET_TIME_ZONE 允许应用程序设置系统时间区域
24 SET_WALLPAPER 设置壁纸
25 SET_WALLPAPER_HINTS 设置壁纸上的提示信息,个性化语言
26 TRANSMIT_IR 红外发射
27 USE_FINGERPRINT 指纹识别
28 VIBRATE 震动
29 WAKE_LOCK 锁屏
30 WRITE_SYNC_SETTINGS 改变设置
31 SET_ALARM 设置警告提示
32 INSTALL_SHORTCUT 创建快捷方式
33 UNINSTALL_SHORTCUT 删除快捷方式
在AndroidManifest.xml文件中的配置方式如下:
1 //XXXX为需要配置的权限名称
2 <uses-permission android:name="android.permission.XXXX"/>
二、高级权限
高级权限如下所示。
1 READ_CALENDAR 日历
2 WRITE_CALENDAR 日历
3 CAMERA 相机
4 READ_CONTACTS 联系人
5 WRITE_CONTACTS 联系人
6 GET_ACCOUNTS 联系人
7 ACCESS_FINE_LOCATION 位置
8 ACCESS_COARSE_LOCATION 位置
9 RECORD_AUDIO 麦克风
10 READ_PHONE_STATE 电话
11 CALL_PHONE 电话
12 READ_CALL_LOG 电话
13 WRITE_CALL_LOG 电话
14 ADD_VOICEMAIL 电话
15 USE_SIP 电话
16 PROCESS_OUTGOING_CALLS 电话
17 BODY_SENSORS 传感器
18 SEND_SMS 短信
19 RECEIVE_SMS 短信
20 READ_SMS 短信
21 RECEIVE_WAP_PUSH 短信
22 RECEIVE_MMS 短信
23 READ_EXTERNAL_STORAGE 存储
24 WRITE_EXTERNAL_STORAGE 存储
动态权限申请的逻辑代码如下所示(以官方读写内存为例):
1 public void requestAllPower() {
2 if (ContextCompat.checkSelfPermission(this,
3 Manifest.permission.WRITE_EXTERNAL_STORAGE)
4 != PackageManager.PERMISSION_GRANTED) {
5 if (ActivityCompat.shouldShowRequestPermissionRationale(this,
6 Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
7 } else {
8 ActivityCompat.requestPermissions(this,
9 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
10 Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
11 }
12 }
13 }
判断动态申请权限的结果代码如下:
1 @Override
2 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
3 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
4
5 if (requestCode == 1) {
6 for (int i = 0; i < permissions.length; i++) {
7 if (grantResults[i] == PERMISSION_GRANTED) {
8 Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
9 } else {
10 Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
11 }
12 }
13 }
14 }
对于动态权限申请,可以采用封装好的权限申请框架方便的处理权限申请问题,这样有利于代码的重用和整洁性