每个Android应用都是独立的,并且运行在自己的受限的安全的环境下,在计算机安全领域,我们称之为沙盒,如果应用想要访问沙盒之外的东西,它必须申请相应的权限。
根据权限的级别,系统会直接授予应用一些级别较低的权限,比如开启闪光灯,但是如果应用想要读取用户的联系人,那系统就会弹出提示,让用户来做决定是否给应用这个权限。
Android权限分成两种,第一种是普通权限(Normal permissions),比如设置时区需要的就只是一个普通权限。普通权限基本上不会涉及到隐私和安全问题。应用在安装的时候,系统就会直接授予应用这些普通权限,我们也无法在安装好了应用之后在系统设置里面取消对这些权限的授权。
从API Level 23——也就是Android 6.0——开始,这些权限被归类为PROTECTION_NORMAL。PROTECTION_NORMAL是android.content.pm.PermissionInfo类的一个字段,我们这里暂且不提。
普通权限包括:
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_IGNORE_BATTERY_OPTIMIZATIONS,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 6.0开始,如果应用要使用高危权限,必须遵循如下步骤:
如果一个高危权限只是在应用的清单文件里面声明,那么应用暂时还没有获取到这个权限。系统会弹出一个对话框,告诉用户应用需要请求某个权限组中的权限。这个对话框上面不会描述这个权限组里面某一个特定的权限。例如,如果一个程序请求READ_CONTACTS权限,系统对话框只会说应用需要联系人的权限。如果用户同意了,那么系统才会给应用它所申请的权限。
如果一个应用在清单文件里面声明了一个高危权限,并且这个应用已经获得了同一个权限组内的另一个高危权限的授权,那么当应用需要这个高危权限的时候,系统就不会再弹出对话框请求用户裁决是否给应用这个权限了。比如如果刚才用户已经授权给应用READ_CONTACTS的权限了,如果应用再去请求WRITE_CONTACTS权限,系统就会自动把这项权限授权给应用。
任何权限都可以属于某个权限组,包括普通权限和用户自定义权限。但是,只有高危权限的权限组才有用。所以您可以不用理会普通权限的权限组问题。
如果设备运行在低于Android 6.0的版本上,那么系统会在安装的时候授予应用它所需要的权限。
再次重申,系统只会请求用户授权某个权限组,而不会只让用户就单个权限向用户发起授权请求