跨程序共享数据-Android权限机制
我们之前在讲广播的时候第一次接触了Android权限相关的内容, 当时为了要访问系统的网络状态以及监听开机广播, 于是在AndroidManifest.xml文件中添加了这样两句权限声明:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />Code language: HTML, XML (xml)
因为访问系统的网络状态以及监听开机广播涉及了用户设备的安全性, 因此必须在AndroidManifest.xml中加入权限声明, 否则我们的程序就会崩溃。
为什么这样就可以保护用户设备的安全性了呢?
其实用户主要在以下两个方面得到了保护, 一方面, 如果用户在低于6.0系统的设备上安装该程序, 会在安装界面给出如图7.1所示的提醒。 这样用户就可以清楚地知晓该程序一共申请了哪些权限, 从而决定是否要安装这个程序。
安装界面的权限提醒
另一方面, 用户可以随时在应用程序管理界面查看任意一个程序的权限申请情况, 如图7.2所示。 这样该程序申请的所有权限就尽收眼底, 什么都瞒不过用户的眼睛, 以此保证应用程序不会出现各种滥用权限的情况。
但是理想是美好的, 现实却很残酷, 因为很多我们所离不开的常用软件普遍存在着滥用权限的情况, 不管到底用不用得到, 反正先把权限申请了再说。 比如说微信所申请的权限列表如图7.3所示
Android开发团队当然也意识到了这个问题, 于是在6.0系统中加入了运行时权限功能。 也就是说, 用户不需要在安装软件的时候一次性授权所有申请的权限, 而是可以在软件的使用过程中再对某一项权限申请进行授权。 比如说一款相机应用在运行时申请了地理位置定位权限, 就算我拒绝了这个权限, 但是我应该仍然可以使用这个应用的其他功能, 而不是像之前那样直接无法安装它。
当然, 并不是所有权限都需要在运行时申请, 对于用户来说, 不停地授权也很烦琐。 Android现在将所有的权限归成了两类, 一类是普通权限, 一类是危险权限。 准确地讲, 其实还有第三类特殊权限, 不过这种权限使用得很少, 因此不在本书的讨论范围之内。 普通权限指的是那些不会直接威胁到用户的安全和隐私的权限, 对于这部分权限申请, 系统会自动帮我们进行授权, 而不需要用户再去手动操作了, 比如在BroadcastTest项目中申请的两个权限就是普通权限。 危险权限则表示那些可能会触及用户隐私或者对设备安全性造成影响的权限, 如获取设备联系人信息、 定位设备的地理位置等, 对于这部分权限申请, 必须要由用户手动点击授权才可以, 否则程序就无法使用相应的功能。
但是Android中有一共有上百种权限, 我们怎么从中区分哪些是普通权限, 哪些是危险权限呢? 其实并没有那么难, 因为危险权限总共就那么几个, 除了危险权限之外, 剩余的就都是普通权限了。 下表列出了Android中所有的危险权限, 一共是9组24个权限。
| 权限组名 | 权限名 |
|---|---|
| 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 |
另外注意一下, 表格中每个危险权限都属于一个权限组, 我们在进行运行时权限处理时使用的是权限名, 但是用户一旦同意授权了, 那么该权限所对应的权限组中所有的其他权限也会同时被授权。访问http://developer.android.google.cn/reference/android/Manifest.permission.html 可以查看Android系统中完整的权限列表。
