Usar o sensor de luz

Saiba como usar o sensor de luz ambiente para detectar alterações na iluminação.

Este exemplo cria um aplicativo simples que depende de um sensor de luz como um dispositivo de entrada. Um sensor de luz ambiente é um dos vários tipos de sensores ambientais que permitem que os aplicativos respondam a alterações no ambiente do usuário.

Note

Este artigo se concentra no código que demonstra como usar um sensor de luz. Para obter uma visão geral do sensor de luz, consulte Sensores: Sensor de luz.

Prerequisites

Você deve estar familiarizado com o sensor de luz e seus usos. Consulte Sensores: Sensor de luz.

O dispositivo ou emulador que você está usando deve dar suporte a um sensor de luz ambiente.

Código de exemplo

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>

Quando o aplicativo é iniciado, você pode alterar os valores de luminosidade ao cobrir e destapar o sensor de luz.

O exemplo anterior demonstra o código essencial que você precisa escrever para integrar a entrada do sensor de luz ao seu aplicativo.

Conectar-se ao sensor

Chame o método GetDefault para estabelecer uma conexão com o sensor de luz padrão.

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

Você também pode chamar FromIdAsync para criar um objeto LightSensor de um valor DeviceInformation.Id. Para obter mais informações, consulte Enumerar dispositivos.

Se nenhum sensor de sensor de luz for detectado, a mensagem de status será atualizada para informar o usuário.

Definir o intervalo de relatório

O intervalo de relatório é definido dentro do construtor da página. Esse código recupera o intervalo mínimo com suporte do dispositivo e o compara a um intervalo solicitado de 16 milissegundos (que aproxima uma taxa de atualização de 60 Hz). Se o intervalo mínimo com suporte for maior que o intervalo solicitado, o código definirá o valor como o mínimo. Caso contrário, define o valor para o intervalo solicitado.

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

Ler dados do sensor

Os novos dados do sensor de luz são capturados no manipulador de eventos ReadingChanged . Sempre que o driver do sensor recebe novos dados do sensor, ele passa os valores para seu aplicativo usando esse evento. Para este exemplo, esses novos valores são gravados nos blocos de texto encontrados no XAML da página correspondente.

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);
    });
}