在 Wear OS 上请求权限与在移动应用中请求权限类似,只不过多了几种用例。本文档假定您了解 Android 权限的工作原理。如果您不了解,请参阅 Android 中的权限的工作原理。
就像在移动应用中一样,用户必须向 Wear 应用授予相应权限才能使用某些功能。Wear 应用应当在不请求任何权限的情况下提供重要的功能。
权限情景
在 Wear OS 上,您可能会遇到以下几种请求危险权限的情景:
Wear 应用为穿戴式设备上运行的应用请求权限。
Wear 应用为手机上运行的应用请求权限。
手机应用为穿戴式设备上运行的应用请求权限。
手机应用请求多项只能在连接穿戴式设备的情况下使用的权限。
如需了解运行中的应用上述所有情形,请查看 ExcersizeSampleCompose 示例。
以下部分将分别介绍每种情景。如需详细了解如何请求权限,请参阅权限请求模式部分。
Wear 应用请求穿戴式设备权限
当 Wear 应用为穿戴式设备上运行的应用请求权限时,系统会显示一个对话框以提示用户授予该权限。在您的应用中,请仅在用户清楚为何需要相应权限才能执行指定操作时请求这些权限。
请查看权限原则以确保您为用户提供出色的体验,也不要忘了根据需要查看 shouldShowRequestPermissionRationale()
和提供更多信息。
如果应用或表盘一次需要多项权限,那么权限请求会接连出现。
![多个权限屏幕,接连显示。](https://developer.android.google.cn/static/images/training/wear/multiple_permissions.png?authuser=0000&hl=nb)
Wear 应用请求手机权限
当 Wear 应用请求手机权限(例如,穿戴式应用想要访问其移动应用上的照片或其他敏感数据)时,Wear 应用必须提示用户在手机上授予此权限。在手机上,手机应用可以使用一个 activity 向用户提供更多信息。在 activity 中,添加两个按钮:一个用于授予权限,一个用于拒绝授予权限。
![Wear 应用提示用户在手机上授予权限。](https://developer.android.google.cn/static/images/training/wear/open_on_phone.png?authuser=0000&hl=nb)
手机应用请求穿戴式设备权限
如果用户处于手机应用中且应用需要穿戴式设备权限(例如,预加载音乐以防手机断开连接),手机应用会提示用户在穿戴式设备上授予此权限。该应用的穿戴式设备版本使用 requestPermissions()
方法触发系统权限对话框。
![手机应用提示用户在穿戴式设备上授予权限。](https://developer.android.google.cn/static/images/training/wear/phone_requests_wear.png?authuser=0000&hl=nb)
手机应用一次请求多项权限
![](https://developer.android.google.cn/static/images/training/wear/companion-device-profile.png?authuser=0000&hl=nb)
对于以 Android 12(API 级别 31)及更高版本为目标平台的合作伙伴应用,可以在连接到手表时使用配套设备配置文件。使用配置文件可将一组设备类型专用权限的授予操作捆绑在一个步骤中,从而简化注册过程。
设备连接后就会向配套应用授予捆绑的权限,且这些权限仅在设备关联时持续有效。删除应用或移除关联时会移除权限。如需了解详情,请参阅 AssociationRequest.Builder.setDeviceProfile()
。
权限请求模式
您可以通过不同模式向用户请求权限。按照优先级顺序,这些模式分别为:
视情况申请权限:当相应权限对于实现特定功能来说显然必不可少,但运行整个应用并不需要该权限时。
视情况加以说明:当请求相应权限的理由不太明显,并且运行整个应用并不需要该权限时。
以下各部分介绍了这些模式。
视情况申请权限
请仅在用户清楚为何需要相应权限才能执行指定操作时请求这些权限。当用户了解某项权限与他们要使用的功能相关时,授予该权限的可能性会更大。
例如,应用可能需要获取用户的位置信息才能显示附近的景点。当用户点按搜索附近的地点时,该应用可以立即请求位置信息权限,因为搜索附近的地点和需要位置信息权限之间有明确的关联。这种关系显而易见,因此应用无需显示额外的说明屏幕。
![应用会在显然有必要时请求权限。](https://developer.android.google.cn/static/images/training/wear/ask_in_context.png?authuser=0000&hl=nb)
视情况加以说明
图 6 显示了视情况加以说明的示例。该应用不需要权限即可启动计时器,但内嵌的说明性提示显示 activity 的部分功能(位置检测)已锁定。当用户点按 提示,系统会显示一个权限请求屏幕,让用户解锁位置信息 检测。
请使用 shouldShowRequestPermissionRationale()
方法来帮助应用决定是否提供更多信息。如需了解详情,请参阅请求应用权限。或者,您也可以查看 GitHub 上的扬声器示例应用如何处理显示信息。
![当需要获得权限时,应用会说明它为何需要该权限。](https://developer.android.google.cn/static/images/training/wear/educate_in_context.png?authuser=0000&hl=nb)
处理遭拒的情况
如果用户拒绝了对既定 activity 不重要的权限请求,请不要阻止他们继续进行该 activity。如果 activity 的某些部分因用户拒绝了所请求的权限而被停用,请提供切实可行的直观反馈。
图 7 显示使用锁形图标来表明某项功能因用户未授予使用此功能的权限而被锁定。
![当用户拒绝授予权限时,在关联的功能旁边会显示锁形图标。](https://developer.android.google.cn/static/images/training/wear/deny.png?authuser=0000&hl=nb)
当之前被拒绝的穿戴式设备权限对话框再次显示时,它会包含一个 Deny, don't show again(拒绝,不再显示)选项。如果用户选择此选项,那么他们将来只能通过进入该穿戴式设备的“设置”应用来授予此权限。
![系统提供停止请求权限的选项。](https://developer.android.google.cn/static/images/training/wear/ask_again.png?authuser=0000&hl=nb)
详细了解如何处理权限请求遭拒情况。
服务权限
只有一个 activity 可以调用 requestPermissions()
方法,因此,如果用户使用某项服务(例如通过表盘)与您的应用互动,该服务必须先打开一个 activity 才能请求权限。在此 activity 中,请进一步说明它为何需要该权限。
一般情况下,请不要为表盘请求权限,而应实现一项复杂功能,让用户通过这项复杂功能选择要显示的数据。
设置
用户可以随时在“设置”中更改 Wear 应用的权限。当用户尝试执行需要某项权限的操作时,请先调用 checkSelfPermission()
方法,以了解应用是否有权执行操作。
即使用户之前已授予该权限,也请执行此项检查,因为用户可能随后又撤消了该权限。
![用户可以通过“设置”应用更改权限。](https://developer.android.google.cn/static/images/training/wear/for_settings.png?authuser=0000&hl=nb)