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

В этой статье можно найти информацию о том, как получить доступ к фонарику устройства (при наличии) и использовать его. Управление фонариком осуществляется отдельно от управления камерой и вспышкой устройства. Кроме информации о фонарике и его настройках, в этой статье приведены сведения о том, как правильно освободить ресурс фонарика, когда он не используется, а также как определить, доступен ли фонарик, если он используется другим приложением.

Как получить доступ к фонарику устройства по умолчанию

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

Как получить доступ к определенному фонарику с помощью строки селектора фонарика

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

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