AndroidManifest配置之uses-permission

描述

uses-permission是AndroidManifest.xml中最常用的一项配置,它用来声明一个app在运行时所需要的权限。这里声明的权限在应用安装时会提醒用户,用户可以选择同意安装或拒绝安装。在Android6.0之前,如果用户同意安装,即表示同意app使用在AndroidManifest.xml中声明的所有权限,在Android6.0之后,将应用的权限分成了两类,一类是Normal permissions, 一类是Dangerous permissions。对AndroidManifest.xml中声明的Normal permissions,和之前版本一样,用户同意安装应用就会被授予这些权限。对AndroidManifest.xml中声明的Dangerous permissions,只表示应用需要用到这些权限,用户同意安装并不会自动授予这类权限,当应用运行时用到这些权限时,需要在代码中申请权限,只有用户同意了,才会被授予。用户同意后也可以随时在系统设置中取消对这类权限的授权。

语法

<uses-permission android:name="string"
        android:maxSdkVersion="integer" />

所属节点

<manifest>

属性

android:name
需要使用的权限的名字,可以是系统自带的权限,也可以是自定义的权限。Android系统提供了100多个权限,可以通过 https://developer.android.com/reference/android/Manifest.permission.html 查看这些权限的名字和含义。这些权限大多数名字都是以android.permission.为前缀,但也有一小部分是com.android.为前缀,需要注意区分。

android:maxSdkVersion
表示需要此项权限的最高的系统API Levle,例如设置android:maxSdkVersion为21,它表示这项权限只在API Level 21(Android5.0)及以下的系统中需要使用。对API Level21以上的系统中不需要使用这项权限。

比较常见的一项和android:maxSdkVersion属性一起使用的是权限是android.permission.WRITE_EXTERNAL_STORAGE。当一个app安装到系统后,Android系统会为其分配一块外部存储空间供其使用(在应用中通过getExternalFilesDir()和getExternalCacheDir()获得),在Android 4.4 (API level 19)之前的系统中,要向这部分存储空间中写入文件,需要获取android.permission.WRITE_EXTERNAL_STORAGE权限,但是从Android 4.4开始,对这部分存储空间的读写已经不需要任何权限了。所以,如果不需要读取这部分存储空间之外的其他外部存储文件,可以在AndroidManifest.xml中这样来声明这个权限。

<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

注意:
1. uses-permission中并没有android:minSdkVersion这样的配置属性。
2. 在同一个AndroidManifest.xml中,允许有重复的uses-permission配置,也就是说允许android:name和android:maxSdkVersion都相同的配置。但是不允许android:name相同,android:maxSdkVersion不同的配置。
例如,如下配置是允许的。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />
<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

如下配置则是不允许的

<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />
<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />
<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="19" />

对应用市场软件分发的影响

部分uses-permission的权限声明会影响应用市场的软件分发策略。例如一个应用在uses-permission中声明了CAMERA权限,这意味着该应用需要使用摄像头才可以正常工作。如果一个设备上没有摄像头,那么当用户在该设备上通过 Google Play搜索或浏览应用时,就不会找到此应用。如果一个应用虽然需要用到摄像头,但并非是必须的,没有摄像头大部分功能也能正常工作,那么就需要在AndroidManifest.xml中添加CAMERA权限的同时,添加<uses-feature>声明。
有关Google Play的筛选策略参见 https://developer.android.com/google/play/filters.html

对应用市场审核的影响

app提交到各个应用市场后都会先经过一个审核的流程,只有审核通过的应用才可以发布。uses-permission声明的权限会影响应用是否能够通过审核。不同应用市场的审核标准不一样,一般国内应用市场对应用权限的审核条件比较宽松,读取和修改通讯录,收发短信,获取GPS位置信息,启用摄像头这些权限在国内市场发布的应用中随处可见。而Google Play对应用权限的审核则非常严格, 任何超出应用自身功能范围的权限申请都无法通过。如果确实需要某项权限,可以提交必须使用该权限的说明,例如一个浏览器需要启用摄像头,一个输入法需要读取通讯录,这类权限申请必须要有充分合理的理由才能够审核通过。而包含像SYSTEM_ALERT_WINDOW,READ_LOGS这类系统级权限的应用基本上没有可能通过Google Play的审核。所以国内APP在发布到Google Play之前需要去掉AndroidManifest所有不必要的权限声明和相应的调用代码。

参考链接

  1. https://developer.android.com/guide/topics/manifest/manifest-intro.html#perms
  2. https://developer.android.com/guide/topics/manifest/uses-permission-element.html
  3. https://developer.android.com/guide/topics/security/permissions.html
  4. https://developer.android.com/training/permissions/best-practices.html
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页