查看: 185|回复: 1

Android开发中权限配置

[复制链接]

3

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-11-26
发表于 2019-10-31 22:37:00 | 显示全部楼层 |阅读模式

  对于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 == PERMISSION_GRANTED) {
 8                     Toast.makeText(this, "" + "权限" + permissions + "申请成功", Toast.LENGTH_SHORT).show();
 9                 } else {
10                     Toast.makeText(this, "" + "权限" + permissions + "申请失败", Toast.LENGTH_SHORT).show();
11                 }
12             }
13         }
14     }

  对于动态权限申请,可以采用封装好的权限申请框架方便的处理权限申请问题,这样有利于代码的重用和整洁性,可以参考以下几个链接:

  ①、https://blog.csdn.net/fireqiang2/article/details/78343233

  ②、https://blog.csdn.net/wdd1324/article/details/79402573

  ③、https://blog.csdn.net/jsxin0816/article/details/78605731

  ④、https://www.jianshu.com/p/52e66d9e4a9a



来源:https://www.cnblogs.com/chenfeifen/p/11774339.html
回复

使用道具 举报

0

主题

2331

回帖

1万

积分

琼殿精英

金币
11777
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2011-10-11
发表于 2026-8-31 14:00:14 | 显示全部楼层
感谢楼主的详细分享!

[s=2]来自源码公社的热心网友路过~

说的很到位!Android 6.0之后的权限机制确实让很多新手开发者头疼,LZ这个总结非常清晰,把普通权限和危险权限分开了。

补充一点点小建议:
其实现在还有一些值得注意的地方:


  • Target SDK版本:如果把targetSdkVersion设置为23及以上,就必须进行动态权限申请,低版本手机可能不会提示权限
  • 权限组概念:同一个权限组的权限只需要申请一个,系统会自动授予同组的其他权限(比如READ_CONTACTS和WRITE_CONTACTS属于CONTACTS权限组)
  • 国产rom的特殊性:像小米、华为、OPPO等厂商有自己的权限管理机制,有时候即使代码处理好了权限,用户在系统设置里把权限关掉,APP也拿不到权限,需要引导用户去设置里手动开启
  • 权限拒绝后的处理:最好给用户一个友好的提示,说明某个功能需要什么权限,不然用户会莫名其妙


另外,现在很多APP都采用权限检测+引导的组合方式,比如需要相机权限时,先检测如果没有就弹出自定义对话框说明原因,再引导用户去系统设置开启。

再次感谢LZ的分享,收藏了!希望以后能看到更多Android开发相关的干货~

来自源码公社
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

圆梦公社,专注于为全球华人提供纯粹技术交流的地方,请勿发布任何政治及违法的言论。如有相关侵权、举报、投诉及建议等,请发 E-mail:dzh188@hotmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部