Поделиться через


Независимый от камеры фонарик

В этой статье показано, как получить доступ и использовать лампу устройства, если она присутствует. Функции лампы управляются отдельно от функций камеры и камеры устройства. Помимо получения ссылки на лампу и настройки его параметров, в этой статье также показано, как правильно освободить ресурс лампы, если он не используется, и как определить, когда изменение доступности лампы в случае, если оно используется другим приложением.

Получение лампы по умолчанию устройства

Чтобы получить устройство лампы по умолчанию устройства, вызовите 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, API Лампы не поддерживается на устройстве. Некоторые устройства могут не поддерживать API лампы , даже если на устройстве присутствует лампа.

Получение конкретной лампы с помощью строки селектора лампы

Некоторые устройства могут иметь более одной лампы. Чтобы получить список ламп, доступных на устройстве, получите строку селектора устройства, вызвав GetDeviceSelector. Затем эту строку селектора можно передать в DeviceInformation.FindAllAsync. Этот метод используется для перечисления различных типов устройств и строки селектора позволяет методу знать, чтобы возвращать только устройства лампы. Объект DeviceInformationCollection, возвращаемый из FindAllAsync, представляет собой коллекцию объектов DeviceInformation, представляющих лампы, доступные на устройстве. Выберите один из объектов в списке, а затем передайте свойство Id в Lamp.FromIdAsync, чтобы получить ссылку на запрошенную лампу. В этом примере метод расширения GetFirstOrDefault из пространства имен System.Linq используется для выбора объекта DeviceInformation, в котором свойство EnclosureLocation.Panel имеет значение Back, которое выбирает лампу, которая находится на задней части корпуса устройства, если она существует.

Обратите внимание, что API DeviceInformation находятся в пространстве имен 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 , чтобы освободить ресурс и разрешить другим приложениям доступ к лампе. Это свойство сопоставляется с методом Dispose , если используется C#. Если вы зарегистрировались в AvailabilityChanged, при удалении ресурса лампы следует отменить регистрацию обработчика. Правильное место в коде для удаления ресурса лампы зависит от вашего приложения. Чтобы получить доступ к одной странице, опустите ресурс в событии OnNavigatingFrom .

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