独立于相机的手电筒

本文介绍如何访问和使用设备灯(如果存在)。 灯功能通过设备的相机和相机闪光灯功能单独管理。 除了获取对灯的引用和调整其设置以外,本文还介绍了在不使用灯资源时如何正确地释放灯资源,以及在灯正由另一个应用使用时,如何检测灯的可用性更改。

获取设备的默认灯

若要获取设备的默认灯设备,请调用 Lamp.GetDefaultAsync。 灯 API 位于 Windows.Devices.Lights 命名空间中。 在尝试访问这些 API 之前,请务必为此命名空间添加一个 using 指令。

using Windows.Devices.Lights;
Lamp lamp;
lamp = await Lamp.GetDefaultAsync();

if (lamp == null)
{
    ShowErrorMessage("No Lamp device found");
    return;
}

如果返回的对象是 null,则该设备不支持 Lamp API。 即使某些设备上实际存在灯,它们也可能不支持 Lamp API。

使用灯选择器字符串获取特定灯

某些设备可以具有多个灯。 若要获取设备上可用灯的列表,请通过调用 GetDeviceSelector 获取设备选择器字符串。 然后,此选择器字符串可以传递到 DeviceInformation.FindAllAsync 中。 此方法用于枚举多种不同类型的设备,而选择器字符串可指示该方法仅返回灯设备。 从 FindAllAsync 返回的 DeviceInformationCollection 对象是表示设备上的可用灯的 DeviceInformation 对象的集合。 选择列表中的某个对象,然后将 Id 属性传递给 Lamp.FromIdAsync,以获取对请求的灯的引用。 此示例使用 System.Linq 命名空间中的 GetFirstOrDefault 扩展方法选择 DeviceInformation 对象,其中,EnclosureLocation.Panel 属性的值为 Back,可选择位于设备外壳背面的灯(如果存在)。

请注意,DeviceInformation API 位于 Windows.Devices.Enumeration 命名空间中。

using Windows.Devices.Enumeration;
using System.Linq;
string selectorString = Lamp.GetDeviceSelector();


DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selectorString);

DeviceInformation deviceInfo =
    devices.FirstOrDefault(di => di.EnclosureLocation != null && 
        di.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back);

if (deviceInfo == null)
{
    ShowErrorMessage("No Lamp device found");
}

lamp = await Lamp.FromIdAsync(deviceInfo.Id);

调整灯设置

拥有 Lamp 类的实例后,请通过将 IsEnabled 属性设置为 true 来打开灯。

lamp.IsEnabled = true;

通过将 IsEnabled 属性设置为 false 来关闭灯。

lamp.IsEnabled = false;

某些设备配备支持颜色值的灯。 通过检查 IsColorSettable 属性来检查灯是否支持颜色。 如果此值为 true,你可以使用 Color 属性设置灯的颜色。

if (lamp.IsColorSettable)
{
    lamp.Color = Windows.UI.Colors.Blue;
}

注册,以在灯可用性发生更改时获得通知

灯访问权限将授予最近请求访问的应用。 因此,如果另一个应用已启动并请求使用你的应用当前在使用的灯资源,则在其他应用释放资源之前,你的应用将不再能够控制灯。 若要在灯的可用性发生更改时收到通知,请注册 Lamp.AvailabilityChanged 事件的处理程序。

lamp = await Lamp.GetDefaultAsync();

if (lamp == null)
{
    ShowErrorMessage("No Lamp device found");
    return;
}

lamp.AvailabilityChanged += Lamp_AvailabilityChanged;

在该事件的处理程序中,检查 LampAvailabilityChanged.IsAvailable 属性以确定灯是否可用。 此示例根据灯的可用性确定是否启用用于打开或关闭灯的切换开关。

private void Lamp_AvailabilityChanged(Lamp sender, LampAvailabilityChangedEventArgs args)
{
    lampToggleSwitch.IsEnabled = args.IsAvailable;
}

适当地处理不处于使用状态的灯资源

当你不再使用灯时,你应该将其禁用,然后调用 Lamp.Close 来释放该资源并允许其他应用访问该灯。 如果你使用的是 C#,此属性将映射到 Dispose 方法。 如果你已注册 AvailabilityChanged,则应当在处理灯资源时注销该处理程序。 代码中用于处理灯资源的正确位置取决于你的应用。 若要将灯访问限制到单个页面,请在 OnNavigatingFrom 事件中释放该资源。

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    lamp.AvailabilityChanged -= Lamp_AvailabilityChanged;
    lamp.IsEnabled = false;
    lamp.Dispose();
    lamp = null;
}