Android权限的最佳实现

来源:https://developer.android.com/training/articles/user-data-permissions.html

Android的权限管理能保护设备上可用的敏感信息,只能在app的功能必须要访问敏感信息时才能使用对应的权限。本文档提供了有关如何实现相同(或更好)功能而无需访问敏感信息的方法。这不是关于Android操作系统中权限如何工作的详尽讨论。有关Android权限的更全面的了解,请参阅《Android权限概述》。有关在代码中如何使用权限的详细信息,请参阅《请求APP权限》。有关在Android上使用唯一标识符的最佳做法,请参阅《唯一标识符的最佳实现》

使用Android权限的原则

在使用Android权限时,建议遵循以下原则:

1、 只能使用APP所必需的权限。可能还有其他方法(system intents, identifiers, backgrounding for phone calls)能实现同样的需求,而无需访问敏感信息。

2、 注意libraries所需的权限。当APP包含一个库时,会继承其权限要求。你应该了解APP所包含的内容,所需的权限以及这些权限的用处。

3、 明晰的。当您发出权限请求时,请清楚您正在访问的内容以及为什么要访问,以便用户做出明智的决定。

4、 显式地访问系统敏感功能。当您访问敏感功能(例如相机或麦克风)时,提供连续的提示可以让用户清楚您在收集数据,避免让用户感觉您在偷偷收集数据。

本指南的其余部分在APP开发的过程中详细阐述了这些原则。

Android 6.0+中的权限

Android 6.0Marshmallow推出了一种新的权限模型,允许APP在运行时向用户请求权限,而不是在安装之前请求权限。支持这种新模型的APP会在真正使用到受保护的隐私数据或服务时才请求权限。虽然这一定不会改变应用的整体行为,但会带来一些与用户敏感数据处理相关的变更:

使用时请求权限:APP在运行时、使用到涉及某个权限的功能时,才向用户请求权限。用户对请求权限的环境更为敏感,如果您请求的权限与APP的功能不匹配,则更应该向用户提供详细的说明,让用户了解您为什么要请求此权限。只要有可能,您应该在请求权限时提供您请求权限的说明,如果用户拒绝请求,则应在后续对话框中做说明。

授予权限有更大的灵活性:用户可以在APP请求权限时或在设置中拒绝授予权限,但是因此导致功能被打断时,他们仍然可能会感到惊讶。最好监控(例如使用Google Analytics)有多少用户拒绝使用权限,以便您可以重构应用程序,以避免依赖该权限,或者更好地解释为什么APP需要使用此权限才能正常的工作。APP还需要处理用户拒绝权限请求或在设置中切换权限开关带来的异常。

增加交互复杂度:用户需要单独授予访问权限组,而不是一次性授予所有权限。您应该精简请求权限的数量,因为请求权限增加了用户交互的负担,并增加了请求权限被拒绝的概率。

避免请求不必要的权限

APP请求权限增加了APP与用户交互的复杂度,所以应该尽量精简请求权限的数量。与其他同功能的请求权限数量更少的应用相比,用户可感知的权限请求的数量会影响APP的下载量,所以最好避免请求不必要功能的权限。本节提供了常见的替代方法,可帮助您精简权限请求数量。

使用Intent替代法

很多时候,要实现一个功能,可能有两种方法。你可以通过请求权限来实现某个功能,也可以通过Intent调用其它APP来实现这个功能。例如,您需要用设备的Camera来拍照,你可以通过调用Camera的API来实现这个功能,但是这需要请求Camera的权限;你也可以你Intent启动Camera模块来实现这个功能,但是不需要请求Camera的权限。

所以,如果您不经常访问用户的数据,你可以使用基于Intent的请求。Android提供了一些APP可以使用,但不需要权限的System Intent,因为用户选择在发出Intent请求时要与应用程序共享什么(如果有的话)。

例如,MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE类型的Intent可用于捕获图像或视频,而不直接使用Camera对象(或请求相关权限)。在这种情况下,系统Intent将在每次捕获图像时代表您向用户请求权限。

使用时请求权限

不要一次性请求太多权限,而是要在用到某个功能时才请求对应的权限,否则用户要在短时间处理太多权限请求框,这可能会导致用户放弃使用你的APP。例如,一个拍照功能的APP在启动时就弹出一个请求Camera权限的提示框,用户不觉得这个不合理,但是如果继续弹出请求READ_CONTACT权限的提示框,那么用户就不能理解为什么APP需要读取联系人的权限。 正确的做法应该是在用户分享照片给好友时再弹出READ_CONTACT权限的提示框,那么用户就不认为请求这个权限是不合理的了。

在丢失Audio焦点后暂停Media

在此例子中,当用户接到电话时,APP需要进入后台,一旦停止呼叫后又重新获取焦点。在这些情况下,常见的方法- 例如,媒体播放器在通话期间静音或暂停 - 是使用PhoneStateListener监听呼叫状态的更改或监听android.intent.action.PHONE_STATE的广播。该解决方案的问题是它需要READ_PHONE_STATE权限,这需要用户同意访问敏感数据(例如其设备和SIM硬件ID以及来电的电话号码)。

         您可以通过为您的应用请求AudioFocus来避免这种情况,因为它不需要明确的权限(因为它不访问敏感信息)。只需将音频切换到后台时所需的代码放在onAudioFocusChange()事件处理程序中,当操作系统移动切换其音频焦点时它将自动运行。有关如何做到这一点的更详细的文档可以在这里找到:https://developer.android.com/guide/topics/media-apps/volume-and-earphones.html

为设备创建APP实例的唯一标识符

在这种情况下,您需要一个唯一的标识符来确定您的APP正在运行的设备。

应用程序可能具有基于设备的偏好设置或消息(例如,在云上为用户保存基于设备的播放列表,以便他们可以为其汽车和家庭拥有不同的播放列表)。一个常见的解决方案是利用Device IMEI等设备标识符,但这需要设备ID和呼叫信息权限组(PHONE in M+)。它还使用不能重置并在所有应用程序之间共享的标识符。

有两种替代方法可以实现此类标识符:

1、 使用com.google.android.gms.iidInstanceID API。getInstance(Context context).getID()将为您的应用程序实例返回唯一的设备标识符。这是应用程序实例作用域的标识符,可以在存储有关应用程序的信息时用作密钥,如果用户重新安装该应用程序,则会重置该标识符。

2、 使用诸如randomUUID()之类的基本系统功能创建自己的标识符,作用域为APP的实例。

为广告或用户分析创建唯一的标识符

在这种情况下,您需要一个唯一的标识符来构建未登录到您的应用的用户的配置文件(例如,用于定位或衡量转化的广告)。

构建用于广告和用户分析的配置文件时,可能需要一个能在其他应用程序之间共享的标识符。通常的解决方案包括利用设备标识符(如Device IMEI),该设备标识符需要设备ID和呼叫信息权限组(PHONE在API级别23+以上),并且用户无法重置此设备标识符。在任何这些情况下,除了使用不可重置的标识符和请求用户似不常用的权限外,您还将违反Play开发者计划政策。

不幸的是,在这些情况下,使用com.google.android.gms.iid InstanceID API或系统函数来创建应用范围的ID是不合适的解决方案,因为ID可能需要在应用程序之间共享。另一种解决方法是通过getId()方法使用AdvertisingIdClient.Info类中的广告标识符。您可以使用getAdvertisingIdInfo(Context)方法创建一个AdvertisingIdClient.Info对象,并调用getId()方法来使用标识符。注意这个方法是阻塞的,所以你不应该从主线程调用它; 这里提供了这种方法的详细说明。https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient

了解您正在使用Libraries

有时您的应用程序中使用的库需要权限。例如,广告和分析库可能需要访问位置或身份权限组才能实现所需的功能。但从用户的角度来看,许可请求来自您的应用程序,而不是库。

正如用户选择对相同功能使用较少权限的应用程序一样,开发人员应该查看其库,并选择不使用不必要权限的第三方SDK。例如,尝试避免需要Identity权限组的库,除非有明确的为什么应用程序需要这些权限的原因。特别是对于提供位置功能的库,请确保您不需要请求FINE_LOCATION权限,除非您使用基于位置的定位功能。

向用户解释为什么需要这些权限

您应该通知用户您正在访问什么以及为什么。研究表明,如果用户知道应用程序需要它们的原因,用户对于权限请求的反感会降低。用户研究表明:用户授予给定APP权限的意愿受到此使用此权限目的的强烈影响。例如,用户授予对其位置的访问意愿将根据请求是否需要支持应用的核心功能或者是否要与广告网络或分析公司共享该信息而变化。

根据他的小组研究,CMU教授Jason Hong总结说,一般来说:当人们知道为什么一个应用程序使用如他们的位置一样敏感的敏感信息时 - 例如,对于有针对性的广告,这比简单地告诉用户应用程序正在使用它们的位置更让人容易接受【1】。

因此,如果您仅使用属于权限组的一部分API调用,则可以明确列出您正在使用哪些权限,以及为什么。例如:

1、 如果您只是使用粗略的位置,请让用户在您的应用说明或帮助文档中了解此信息。

2、 如果您需要访问SMS消息来接收身份验证码,以保护用户免受欺诈,请让用户在您的应用描述和/或您第一次访问数据时了解此信息。

在某些情况下,让用户实时了解敏感数据访问也是有利的。例如,如果您正在访问摄像

头或麦克风,通常情况下,用通知图标让用户知道您正在访问摄像头或麦克风,而不是你在偷偷收集数据。最终,如果您需要请求在您的应用程序中执行某项操作的权限,但是用户不清楚原因,请找到一种方式让用户知道您需要最敏感权限的原因。

6.0  参考

[1] ModelingUsers’ Mobile App Privacy Preferences: Restoring Usability in a Sea ofPermission Settings, by J. Lin B. Liu,N. Sadeh and J. Hong. In Proceedings of SOUPS 2014.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值