Lanterna independente da câmera

Este artigo mostra como acessar e usar a lâmpada do dispositivo, se houver uma. A funcionalidade da lâmpada é gerenciada separadamente da câmera e do flash da câmera do dispositivo. Além de oferecer uma referência para a lâmpada e o ajuste de suas configurações, este artigo também mostra como liberar o recurso da lâmpada corretamente quando ela não estiver em uso e como detectar quando a disponibilidade da lâmpada muda caso esteja sendo usada por outro aplicativo.

Obter a lâmpada padrão do dispositivo

Para obter o dispositivo de lâmpada padrão do dispositivo, chame Lamp.GetDefaultAsync. As APIs da lâmpada são encontradas no namespace Windows.Devices.Lights. Certifique-se de adicionar uma diretiva de uso para esse namespace antes de tentar acessar essas APIs.

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

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

Se o objeto retornado for nulo, a API da Lâmpada não terá suporte no dispositivo. Alguns dispositivos podem não oferecer suporte à API da Lâmpada mesmo se houver uma lâmpada fisicamente presente no dispositivo.

Obtenha uma lâmpada específica usando a cadeia de caracteres do seletor de lâmpada

Alguns dispositivos podem ter mais de uma lâmpada. Para obter uma lista de lâmpadas disponíveis no dispositivo, obtenha a cadeia de caracteres do seletor de dispositivo chamando GetDeviceSelector. Essa cadeia de caracteres do seletor pode então ser passada para DeviceInformation.FindAllAsync. Esse método é usado para enumerar os diversos tipos de dispositivos, e a cadeia de caracteres do seletor informa ao método para retornar apenas os dispositivos de lâmpada. O objeto DeviceInformationCollection retornado de FindAllAsync é uma coleção de objetos DeviceInformation que representam as lâmpadas disponíveis no dispositivo. Selecione um dos objetos na lista e passe a propriedade Id para Lamp.FromIdAsync a fim de obter uma referência para a lâmpada solicitada. Este exemplo usa o método de extensão GetFirstOrDefault do namespace System.Linq para selecionar o objeto DeviceInformation em que a propriedade EnclosureLocation.Panel tem um valor Back, que seleciona uma lâmpada que está na parte posterior do compartimento do dispostivo, caso haja uma.

Observe que as APIs DeviceInformation são encontradas no namespace 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);

Ajustar as configurações da lâmpada

Quando você tiver uma instância da classe Lamp, ative a lâmpada definindo a propriedade IsEnabled como true.

lamp.IsEnabled = true;

Desativar a lâmpada definindo a propriedade IsEnabled como false.

lamp.IsEnabled = false;

Alguns dispositivos têm lâmpadas que dão suporte a valores de cor. Verifique se uma lâmpada dá suporte a cor verificando a propriedade IsColorSettable. Se esse valor for true, você poderá definir a cor da lâmpada com a propriedade Color.

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

Registre-se para ser notificado se houver mudança na disponibilidade da lâmpada

O acesso à lâmpada é concedido ao aplicativo mais recente a solicitar acesso. Portanto, se outro aplicativo for iniciado e solicitar um recurso de lâmpada que seu aplicativo esteja usando no momento, seu aplicativo não poderá mais controlar a lâmpada até que o outro aplicativo tenha liberado o recurso. Para receber uma notificação quando a disponibilidade da lâmpada mudar, registre um manipulador para o evento Lamp.AvailabilityChanged.

lamp = await Lamp.GetDefaultAsync();

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

lamp.AvailabilityChanged += Lamp_AvailabilityChanged;

No manipulador para o evento, verifique a propriedade LampAvailabilityChanged.IsAvailable para determinar se a lâmpada está disponível. Neste exemplo, um botão de alternância para ativar e desativar a lâmpada está habilitado ou desabilitado com base na disponibilidade da lâmpada.

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

Descartar corretamente o recurso da lâmpada quando não estiver em uso

Quando você não estiver mais usando a lâmpada, deverá desativá-la e chamar Lamp.Close para liberar o recurso e permitir que outros aplicativos acessem a lâmpada. Essa propriedade será mapeada para o método Descarte se você estiver usando C#. Se você se registrou para o AvailabilityChanged, deverá cancelar o registro do manipulador quando descartar o recurso de lâmpada. O lugar certo em seu código para descartar o recurso de lâmpada depende do seu aplicativo. Para analisar o acesso da lâmpada a uma única página, libere o recurso no evento OnNavigatingFrom.

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