Linterna independiente de la cámara

En este artículo se muestra cómo acceder a la luz de un dispositivo y cómo usarla, si la hay. La funcionalidad de luz se administra por separado de la cámara del dispositivo y la funcionalidad de flash de la cámara. Además de adquirir una referencia a la luz y ajustar su configuración, este artículo también muestra cómo liberar correctamente el recurso de luz cuando no está en uso y cómo detectar cuándo cambia la disponibilidad de la luz en caso de que la esté usando otra aplicación.

Obtener la luz predeterminada del dispositivo

Para obtener el dispositivo de luz predeterminado de un dispositivo, realiza una llamada a Lamp.GetDefaultAsync. Las API de luz se encuentran en el espacio de nombres Windows.Devices.Lights. Asegúrate de agregar una directiva using a este espacio de nombres antes de intentar acceder a estas API.

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

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

Si el objeto devuelto es null, la API Lamp no es compatible con el dispositivo. Puede que algunos dispositivos no admitan la API Lamp incluso si hay una luz físicamente presente en el dispositivo.

Obtener una luz específica con la cadena de selector de luz

Algunos dispositivos pueden tener más de una luz. Para obtener una lista de las luces disponibles en el dispositivo, obtén la cadena de selector de dispositivos mediante una llamada a GetDeviceSelector. A continuación, se puede pasar esta cadena de selector en DeviceInformation.FindAllAsync. Este método se usa para enumerar los distintos tipos de dispositivos y la cadena de selector permite que el método sepa cómo devolver solo los dispositivos de luz. El objeto DeviceInformationCollection devuelto por FindAllAsync es una colección de objetos DeviceInformation que representan las luces disponibles en el dispositivo. Selecciona uno de los objetos en la lista y, a continuación, pasa la propiedad Id a Lamp.FromIdAsync para obtener una referencia a la luz solicitada. Este ejemplo usa el método de extensión GetFirstOrDefault desde el espacio de nombres System.Linq para seleccionar el objeto DeviceInformation donde la propiedad EnclosureLocation.Panel tiene un valor de Back, que selecciona una luz que se encuentra en la parte posterior del dispositivo, si existe una.

Ten en cuenta que las API DeviceInformation se encuentran en el espacio de nombres 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 la configuración de la luz

Una vez que tengas una instancia de la clase Lamp, establece la propiedad IsEnabled en true para activar la luz.

lamp.IsEnabled = true;

Desactiva la lámpara estableciendo la propiedad IsEnabled en false.

lamp.IsEnabled = false;

Algunos dispositivos tienen luces que admiten valores de color. Comprueba si una luz admite color comprobando la propiedad IsColorSettable. Si este valor es true, puedes definir el color de la luz con la propiedad Color.

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

Registrarse para recibir notificaciones cuando cambie la disponibilidad de luz

El acceso a la luz se concede a la aplicación que solicitó acceso más recientemente. Por lo tanto, si otra aplicación se inicia y solicita un recurso de luz que tu aplicación está usando actualmente, la aplicación ya no podrá controlar la luz hasta que la otra aplicación haya liberado el recurso. Para recibir una notificación cuando cambie la disponibilidad de la luz, registra un controlador para el evento Lamp.AvailabilityChanged.

lamp = await Lamp.GetDefaultAsync();

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

lamp.AvailabilityChanged += Lamp_AvailabilityChanged;

En el controlador para el evento, comprueba la propiedad LampAvailabilityChanged.IsAvailable para determinar si la luz está disponible. En este ejemplo, se habilita o deshabilita un modificador de alternancia para activar y desactivar la luz en función de la disponibilidad de luz.

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

Desechar correctamente el recurso de luz cuando no esté en uso

Cuando ya no uses la luz, debes deshabilitarla y llamar a Lamp.Close para liberar el recurso y permitir que otras aplicaciones puedan acceder a la luz. Esta propiedad se asigna al método Dispose si estás usando C#. Si registraste la aplicación para AvailabilityChanged, debes anular el registro del controlador cuando deseches el recurso de luz. El lugar adecuado en el código para desechar el recurso de luz depende de la aplicación. Para limitar el ámbito de acceso a la luz a una sola página, libera el recurso en el evento OnNavigatingFrom.

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