Linterna independiente de la cámaraCamera-independent Flashlight

En este artículo se muestra cómo acceder a la luz de un dispositivo y cómo usarla, si la hay.This article shows how to access and use a device's lamp, if one is present. La funcionalidad de luz se administra por separado de la cámara del dispositivo y la funcionalidad de flash de la cámara.Lamp functionality is managed separately from the device's camera and camera flash functionality. 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.In addition to acquiring a reference to the lamp and adjusting its settings, this article also shows you how to properly free up the lamp resource when it's not in use, and how to detect when the lamp's availability changes in case it is being used by another app.

Obtener la luz predeterminada del dispositivoGet the device's default lamp

Para obtener el dispositivo de luz predeterminado de un dispositivo, realiza una llamada a Lamp.GetDefaultAsync.To get a device's default lamp device, call Lamp.GetDefaultAsync. Las API de luz se encuentran en el espacio de nombres Windows.Devices.Lights.The lamp APIs are found in the Windows.Devices.Lights namespace. Asegúrate de agregar una directiva using a este espacio de nombres antes de intentar acceder a estas API.Be sure to add a using directive for this namespace before attempting to access these APIs.

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.If the returned object is null, the Lamp API is unsupported on the device. Puede que algunos dispositivos no admitan la API Lamp incluso si hay una luz físicamente presente en el dispositivo.Some devices may not support the Lamp API even if there is a lamp physically present on the device.

Obtener una luz específica con la cadena de selector de luzGet a specific lamp using the lamp selector string

Algunos dispositivos pueden tener más de una luz.Some devices may have more than one lamp. Para obtener una lista de las luces disponibles en el dispositivo, obtén la cadena de selector de dispositivos mediante una llamada a GetDeviceSelector.To obtain a list of lamps available on the device, get the device selector string by calling GetDeviceSelector. A continuación, se puede pasar esta cadena de selector en DeviceInformation.FindAllAsync.This selector string can then be passed into 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.This method is used to enumerate many different kinds of devices and the selector string lets the method know to return only lamp devices. El objeto DeviceInformationCollection devuelto por FindAllAsync es una colección de objetos DeviceInformation que representan las luces disponibles en el dispositivo.The DeviceInformationCollection object returned from FindAllAsync is a collection of DeviceInformation objects representing the lamps available on the device. 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.Select one of the objects in the list and then pass the Id property to Lamp.FromIdAsync to get a reference to the requested lamp. 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.This example uses the GetFirstOrDefault extension method from the System.Linq namespace to select the DeviceInformation object where the EnclosureLocation.Panel property has a value of Back, which selects a lamp that is on the back of the device's enclosure, if one exists.

Ten en cuenta que las API DeviceInformation se encuentran en el espacio de nombres Windows.Devices.Enumeration.Note that the DeviceInformation APIs are found in the Windows.Devices.Enumeration namespace.

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 luzAdjust lamp settings

Una vez que tengas una instancia de la clase Lamp, establece la propiedad IsEnabled en true para activar la luz.After you have an instance of the Lamp class, turn the lamp on by setting the IsEnabled property to true.

lamp.IsEnabled = true;

Desactiva la lámpara estableciendo la propiedad IsEnabled en false.Turn the lamp off by setting the IsEnabled property to false.

lamp.IsEnabled = false;

Algunos dispositivos tienen luces que admiten valores de color.Some devices have lamps that support color values. Comprueba si una luz admite color comprobando la propiedad IsColorSettable.Check if a lamp supports color by checking the IsColorSettable property. Si este valor es true, puedes definir el color de la luz con la propiedad Color.If this value is true, you can set the color of the lamp with the Color property.

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

Registrarse para recibir notificaciones cuando cambie la disponibilidad de luzRegister to be notified if the lamp availability changes

El acceso a la luz se concede a la aplicación que solicitó acceso más recientemente.Lamp access is granted to the most recent app to request access. 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.So, if another app is launched and requests a lamp resource that your app is currently using, your app will no longer be able to control the lamp until the other app has released the resource. Para recibir una notificación cuando cambie la disponibilidad de la luz, registra un controlador para el evento Lamp.AvailabilityChanged.To receive a notification when the availability of the lamp changes, register a handler for the Lamp.AvailabilityChanged event.

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.In the handler for the event, check the LampAvailabilityChanged.IsAvailable property to determine if the lamp is available. 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.In this example, a toggle switch for turning the lamp on and off is enabled or disabled based on the lamp availability.

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

Desechar correctamente el recurso de luz cuando no esté en usoProperly dispose of the lamp resource when not in use

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.When you are no longer using the lamp, you should disable it and call Lamp.Close to release the resource and allow other apps to access the lamp. Esta propiedad se asigna al método Dispose si estás usando C#.This property is mapped to the Dispose method if you are using C#. Si registraste la aplicación para AvailabilityChanged, debes anular el registro del controlador cuando deseches el recurso de luz.If you registered for the AvailabilityChanged, you should unregister the handler when you dispose of the lamp resource. El lugar adecuado en el código para desechar el recurso de luz depende de la aplicación.The right place in your code to dispose of the lamp resource depends on your app. Para limitar el ámbito de acceso a la luz a una sola página, libera el recurso en el evento OnNavigatingFrom.To scope lamp access to a single page, release the resource in the OnNavigatingFrom event.

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