独立于相机的手电筒
本文介绍如何访问和使用设备灯(如果存在)。 灯功能通过设备的相机和相机闪光灯功能单独管理。 除了获取对灯的引用和调整其设置以外,本文还介绍了在不使用灯资源时如何正确地释放灯资源,以及在灯正由另一个应用使用时,如何检测灯的可用性更改。
获取设备的默认灯
若要获取设备的默认灯设备,请调用 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;
}
相关主题