Usar el sensor de luz

Aprenda a usar el sensor de luz ambiente para detectar cambios en la iluminación.

En este ejemplo se crea una aplicación sencilla que se basa en un sensor de luz como dispositivo de entrada. Un sensor de luz ambiental es uno de los distintos tipos de sensores ambientales que permiten a las aplicaciones responder a los cambios en el entorno del usuario.

Note

Este artículo se centra en el código que muestra cómo usar un sensor de luz. Para obtener información general sobre el sensor de luz, consulte Sensores: Sensor de luz.

Prerequisites

Debe estar familiarizado con el sensor de luz y sus usos. Consulte Sensores: Sensor de luz.

El dispositivo o emulador que está usando debe admitir un sensor de luz ambiente.

Código de ejemplo

using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;

namespace DevicesDemo.Pages
{
    public sealed partial class LightSensorPage : Page
    {
        private LightSensor? lightSensor;

        public LightSensorPage()
        {
            InitializeComponent();

            // Get the default light sensor object.
            lightSensor = LightSensor.GetDefault();

            if (lightSensor != null)
            {
                // Establish the report interval.
                uint minReportInterval = lightSensor.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                lightSensor.ReportInterval = reportInterval;

                // Assign an event handler for the reading-changed event.
                lightSensor.ReadingChanged += LightSensor_ReadingChanged;
            }
            else
            {
                statusBar.Message = "No light sensor was found.";
                statusBar.Severity = InfoBarSeverity.Error;
                statusBar.IsOpen = true;
            }
        }

        // This event handler writes the current light
        // reading to the text block on the XAML page.
        private void LightSensor_ReadingChanged(LightSensor sender, LightSensorReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                LightSensorReading reading = args.Reading;
                txtLuxValue.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
            });
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Margin="24">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
        </Grid.RowDefinitions>
        <TextBlock Text="LUX Reading:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtLuxValue" Grid.Column="1" Text="---"/>
    </Grid>

    <InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>

Cuando se ejecuta la aplicación, puedes cambiar los valores de luz cubriendo y revelando el sensor de luz.

En el ejemplo anterior se muestra el código esencial que debe escribir para integrar la entrada del sensor de luz en la aplicación.

Conexión al sensor

Llame al método GetDefault para establecer una conexión con el sensor de luz predeterminado.

private LightSensor? lightSensor;
// ...
lightSensor = LightSensor.GetDefault();

También puede llamar a FromIdAsync para crear un objeto LightSensor desde un valor DeviceInformation.Id. Para obtener más información, consulta Enumerar dispositivos.

Si no se detecta ningún sensor de sensor de luz, el mensaje de estado se actualiza para informar al usuario.

Establecimiento del intervalo de informe

El intervalo de informe se establece dentro del constructor de la página. Este código recupera el intervalo mínimo admitido por el dispositivo y lo compara con un intervalo solicitado de 16 milisegundos (que aproxima una frecuencia de actualización de 60 Hz). Si el intervalo mínimo admitido es mayor que el intervalo solicitado, el código establece el valor en el mínimo. De lo contrario, establece el valor en el intervalo solicitado.

uint minReportInterval = lightSensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
lightSensor.ReportInterval = reportInterval;

Leer datos del sensor

Los nuevos datos del sensor de luz se capturan en el controlador de eventos ReadingChanged . Cada vez que el controlador del sensor recibe nuevos datos del sensor, pasa los valores a la aplicación mediante este evento. En este ejemplo, estos nuevos valores se escriben en los bloques de texto que se encuentran en el XAML de la página correspondiente.

lightSensor.ReadingChanged += LightSensor_ReadingChanged;
// ...

private void LightSensor_ReadingChanged(LightSensor sender, LightSensorReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        LightSensorReading reading = args.Reading;
        txtLuxValue.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
    });
}