前言:
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 | |
ERAD_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 |
这张表可以作为一个参照表,每当使用一个权限的时,可以先到这张表中来查看一下,如果在属于这张表中的权限,那么就需要进行运行时权限处理,如果不在这张表中,那么只需要在AndroidManifest.xml文件中添加一下权限声明就可以了。
另外需要注意,表格中每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中所有其他的权限也会同时被授权。
但是对于针对Android O(Android 8.0)的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
例如,假设某个应用在其清单中列出READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE。应用请求READ_EXTERNAL_STORAGE,并且用户授予了该权限,如果该应用针对的是API级别24或更低级别,系统还会同时授予WRITE_EXTERNAL_STORAGE,因为该权限也属于STORAGE权限组并且也在清单中注册过。如果该应用针对的是Android O,则系统此时仅会授予READ_EXTERNAL_STORAGE,不过在该应用以后申请WRITE_EXTERNAL_STORAGE权限时,系统会立即授予该权限,而不会提示用户。
注意:如果使用了没有授权的权限,会崩溃的
所以对于8.0权限,我们要做的处理,是尽量把所用到的危险权限全部申请。但是有的权限在不同版本出现,所以要兼容不同的版本,所以要加一个版本的判断。
归根结底:android M (6.0)以后,申请权限组一个,即表示整个权限组可以用,所以我们干脆,只要api 版本大于23(6.0),我们申请的权限就是申请整个权限组。这样就兼容了android8.0……