管理眼动跟踪访问和校准

HoloLens 2 上的眼动跟踪可提供强大的功能,从而显著提升用户交互。 但是,要在你的应用中使用眼动跟踪,必须成功完成两个用户检查点。 这两个检查点是 (a) 批准应用的眼动跟踪访问权限,以及 (b) 在设备上完成眼动跟踪校准。 系统会根据需要自动提示用户完成这些操作,但用户可能会因意外拒绝某些内容而卡在某一步。 本文档概述了导航眼动跟踪检查点并帮助用户在需要时重试的最佳做法,以确保流畅和高质量的应用程序体验。

访问请求

要利用眼动跟踪,你的应用必须首先请求访问权限。 这是通过调用 EyesPose::RequestAccessAsync 来完成的,该调用记录在眼睛视线开发指南中。 此函数将触发系统检查,以查看应用程序是否有眼睛视线访问权限。 在安装后的第一个访问请求中,用户将收到系统提示的权限对话框。 如果他们单击“是”,该函数将返回 GazeInputAccessStatus::Allowed,你的应用可以继续运行。 但是,如果用户选择“否”,该函数将返回 GazeInputAccessStatus::DeniedByUser

Image of the HoloLens 2 ET permissions dialog

访问请求对话框仅显示一次,即首次启动应用程序时。 用户做出选择后,系统会记住其首选项,并将其应用于该登录用户将来的所有访问请求。 如果用户以后想要更改首选项,他们可以前往 HoloLens“设置”应用中的“隐私”页面,通过“应用权限”部分执行此操作。 由于首选项是粘滞的,用户可能会不慎进入眼动跟踪关闭的状态,且不知如何解决此问题。 如果眼动跟踪是应用体验的重要组成部分,并且你检测到眼动跟踪访问被拒绝,则可以通过将设置应用直接启动到正确的页面来帮助用户。 这是通过调用 Launcher::LaunchUriAsync 并使用字符串“ms-settings:privacy-eyetracker.”完成的

using namespace winrt::Windows::System::Launcher;
using namespace winrt::Windows::Foundation;

LaunchUriAsync(Uri(L"ms-settings:privacy-eyetracker"));

应避免自动启动设置应用或反复提示用户。 相反,请在 UI 中寻找适当的位置,在此显示眼动跟踪 (ET) 访问的当前状态,解释眼动跟踪对于应用程序的意义,并为用户提供一个按钮来自行启动该权限。

延迟访问请求

意外拒绝访问请求的一个常见原因是用户首次启动应用时,界面堆叠了太多的弹窗。 这种情况的最佳做法等到应用首次需使用眼动跟踪时再请求访问。 例如,首次出现眼动跟踪 (ET) 优化的菜单时。 如此,用户在做出选择时将有更充分的情境,受到的干扰也更少,从而减少了以后需要更改选择的几率。

OpenXR 注意事项

如果使用 OpenXR,则上述规则同样适用,但触发访问请求的 API 略有不同。 使用启用了眼动跟踪扩展 (XR_EXT_eye_gaze_interaction) 的实例时,OpenXR 应用程序将在调用 xrCreateSession 后自动请求权限。 若要详细了解如何通过 OpenXR 使用眼动跟踪,请访问 OpenXR 规范中的眼睛视线扩展文档

用户校准

应用有权访问眼动跟踪后,下一个检查点是用户校准。 与访问请求类似,有特定的 API 可以在调用时触发校准 UI 提示。 该 API 为 SpatialPointerPose::Eyes。 请注意,这也是用于检索每个帧上眼睛视线姿势数据的 API,因此实际上,访问眼动跟踪数据会触发校准提示。 因此,应用程序应等到实际需要使用眼动跟踪姿势数据时,再调用此 API 并触发提示。

Image of the HoloLens 2 ET calibration prompt

HoloLens 可缓存校准,并在检测到已校准的用户打开设备时自动切换。 因此,只有尚未在设备上校准过眼睛视线的用户会收到此提示。 如果未校准的用户在提示时按“取消”来拒绝校准,则设备上的任何应用程序均无法获得访问眼睛视线权限。 HoloLens 会记住他们的选择,在脱下设备并重新戴上之前不会再次提示。 上述设置出于隐私目的非常重要,但用户如果意外取消提示,将无法在应用程序中使用眼动跟踪,并因此产生困惑。

若要检查当前用户是否已校准,请调用 EyesPose::IsCalibrationValid。 如果当前用户未校准,最好回退到不依赖于眼睛视线的交互。 但是,如果眼睛视线对于你应用的体验至关重要,你需要确保所有用户都经过校准,则可以使用 Launcher::LaunchUriForResultsAsync 和字符串“ms-hololenssetup://EyeTracking.”手动调用校准应用

using namespace winrt::Windows::System::Launcher;
using namespace winrt::Windows::Foundation;

winrt::Windows::System::LauncherOptions options;
auto package = winrt::Windows::ApplicationModel::Package::Current();
options.TargetApplicationPackageFamilyName(L"Microsoft.HoloLensSetup_8wekyb3d8bbwe");
winrt::Windows::System::Launcher::LaunchUriForResultsAsync(winrt::Windows::Foundation::Uri(L"ms-hololenssetup://EyeTracking"), options);

LaunchUriForResultsAsync 是更知名的 LaunchUriAsync API 的同级,后者已成为建议用来启动校准应用的方法之一。 但是,LaunchUriAsync 方法不能保证在校准完成后返回到应用程序。 在大多数情况下,它只会返回到 shell。 LaunchUriForResultsAsync API 可以保证返回应用程序,因此对用户来说是更好的体验。

LaunchUriForResultsAsync 需要一个附加的“options”参数,并将“TargetApplicationPackageFamilyName”属性设置为与 HoloLens 应用程序的安装程序相匹配。 如果你需要 HoloLens 上安装的应用程序的程序包系列名称字符串,可以在 Windows 设备门户的“应用:已安装的应用”部分下“PackageRelativeId.”找到它只需删除字符串末尾的“!App”字符。

Image of a portion of the installed apps page in the Windows Device Portsl

应用绝不应在无需用户交互的情况下就自动启动眼睛视线校准。 与访问请求类似,我们建议 UI 中寻找适当的位置,在此显示眼睛视线校准的当前状态,解释校准对于应用程序的意义,并为用户提供一个按钮来自行启动校准。

OpenXR 注意事项

如果使用 OpenXR,则上述规律同样适用,但触发校准提示的 API 略有不同。 在 OpenXR 中,第一次调用 xrSyncActions 时将为未校准用户触发提示,以启用眼睛视线校准操作。 若要详细了解如何通过 OpenXR 使用眼动跟踪,请访问 OpenXR 规范中的眼睛视线扩展文档