Поделиться через


Доступ к датчикам устройства

Browse sample. Обзор примера

Устройства имеют все виды датчиков, доступных вам. Некоторые датчики могут обнаруживать движение, другие изменения в среде, такие как свет. Мониторинг и реагирование на эти датчики делает приложение динамическим в адаптации к тому, как используется устройство. Вы также можете реагировать на изменения датчиков и оповещать пользователя. В этой статье представлен краткий обзор распространенных датчиков, поддерживаемых интерфейсом приложений .NET Multi-platform (.NET MAUI).

Типы, связанные с датчиком устройства, доступны в Microsoft.Maui.Devices.Sensors пространстве имен.

Скорость датчика

Скорость датчика задает скорость, в которой датчик вернет данные в приложение. При запуске датчика вы предоставляете нужную скорость датчика SensorSpeed с перечислением:

  • Fastest
    Получение данных датчика как можно быстрее (не гарантируется, что он возвращается в потоке пользовательского интерфейса).

  • Game
    Ставка подходит для игр (не гарантируется, что возвращается поток пользовательского интерфейса).

  • UI
    Скорость, подходящая для общего пользовательского интерфейса.

  • Default
    Частота по умолчанию, подходящая для изменений ориентации экрана.

Предупреждение

Мониторинг слишком большого количества датчиков одновременно может повлиять на передачу данных датчика скорости в приложение.

В .NET 8 SensorSpeed интервалы одинаковы на всех платформах:

  • Default использует интервал в 200 мс.
  • UI использует интервал в 60 мс.
  • Game использует интервал в 20 мс.
  • Fastest использует интервал в 5 мс.

Обработчики событий датчика

Обработчики событий, добавленные к датчикам с Game скоростью или Fastest скоростью , не гарантируются для запуска в потоке пользовательского интерфейса. Если обработчик событий должен получить доступ к элементам пользовательского интерфейса, используйте MainThread.BeginInvokeOnMainThread метод для выполнения этого кода в потоке пользовательского интерфейса.

Accelerometer

Датчик акселерометра измеряет ускорение устройства вдоль трех осей. Данные, сообщаемые датчиком, представляют, как пользователь перемещает устройство.

Интерфейс IAccelerometer предоставляет доступ к датчику и доступен через Accelerometer.Default свойство. Интерфейс IAccelerometer и Accelerometer класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Начать

Для доступа к функциям акселерометра может потребоваться следующая настройка для конкретной платформы:

Если приложение предназначено для Android 12+ (API 31+), система устанавливает ограничение на 200 Гц на частоту обновления данных этого датчика. Если приложение должно собирать данные датчика Fastest с помощью скорости датчика, необходимо объявить HIGH_SAMPLING_RATE_SENSORS разрешение. Разрешение можно настроить следующим образом:

  • Добавьте разрешение на основе сборки:

    Откройте файл Platform/Android/MainApplication.cs и добавьте следующий атрибут сборки после using директив:

    [assembly: UsesPermission(Android.Manifest.Permission.HighSamplingRateSensors)]
    

    - или -

  • Обновите манифест Android:

    Откройте файл Platform/Android/AndroidManifest.xml и добавьте в узел следующую строкуmanifest:

    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
    

    - или -

  • Обновите манифест Android в редакторе манифеста:

    В Visual Studio дважды щелкните файл Platform/Android/AndroidManifest.xml , чтобы открыть редактор манифеста Android. Затем в разделе "Необходимые разрешения" проверка разрешения HIGH_SAMPLING_RATE_SENSORS. Это действие автоматически обновляет файл AndroidManifest.xml.

Примечание.

Если пользователь отключает доступ к микрофону с помощью переключателей устройства, датчики движения и положения всегда ограничены скоростью, независимо от того, объявляется HIGH_SAMPLING_RATE_SENSORS ли разрешение.

Мониторинг датчика акселерометра

Чтобы начать мониторинг датчика акселерометра, вызовите IAccelerometer.Start метод. .NET MAUI отправляет в приложение изменения данных акселерометра IAccelerometer.ReadingChanged , вызывая событие. IAccelerometer.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга акселерометра со IAccelerometer.IsMonitoring свойством, которое будет true выполняться, если акселерометр был запущен и в настоящее время отслеживается.

В следующем примере кода демонстрируется мониторинг акселерометра для изменений:

public void ToggleAccelerometer()
{
    if (Accelerometer.Default.IsSupported)
    {
        if (!Accelerometer.Default.IsMonitoring)
        {
            // Turn on accelerometer
            Accelerometer.Default.ReadingChanged += Accelerometer_ReadingChanged;
            Accelerometer.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off accelerometer
            Accelerometer.Default.Stop();
            Accelerometer.Default.ReadingChanged -= Accelerometer_ReadingChanged;
        }
    }    
}

private void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
    // Update UI Label with accelerometer state
    AccelLabel.TextColor = Colors.Green;
    AccelLabel.Text = $"Accel: {e.Reading}";
}

Показания акселерометра передаются обратно в G. G — это единица силы гравитации, равной гравитации, вызванной гравитационным полем Земли $(9,81 м/с^2)$.

Система координат определяется относительно экрана устройства в его ориентации по умолчанию. Оси не переключяются при изменении ориентации экрана устройства.

Ось X является горизонтальной и указывает справа, ось Y вертикали и указывает вверх, а ось Z указывает на внешний вид экрана. В этой системе координаты за экраном имеют отрицательные значения Z .

Примеры:

  • Когда устройство находится на столе и отправляется слева направо, значение ускорения X положительно.

  • Когда устройство находится на таблице, ускорение равно +1,00 Г или $(+9,81 m/s^2)$, которое соответствует ускорению устройства $(0 m/s^2)$ минус сила тяжести $(-9,81 m/s^2)$ и нормализована как в G.

  • Когда устройство лежит на таблице и толкается к небу с ускорением A $m/s^2$, значение ускорения равно $A+9,81$ , которое соответствует ускорению устройства $(+A m/s^2)$ минус сила тяжести $(-9,81 m/s^2)$ и нормализована в G.

Сведения для конкретной платформы (Accelerometer)

Нет сведений о конкретной платформе, связанных с датчиком акселерометра.

Барометр

Датчик барометра измеряет внешнее давление воздуха. Данные, сообщаемые датчиком, представляют текущее давление воздуха. Эти данные сообщаются при первом запуске мониторинга датчика, а затем при каждом изменении давления.

Интерфейс IBarometer предоставляет доступ к датчику и доступен через Barometer.Default свойство. Интерфейс IBarometer и Barometer класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Чтобы начать мониторинг датчика барометра, вызовите IBarometer.Start метод. .NET MAUI отправляет в приложение данные о давлении воздуха, вызывая IBarometer.ReadingChanged событие. IBarometer.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга барометра со IBarometer.IsMonitoring свойством, которое будет true выполняться, если барометр в настоящее время отслеживается.

Чтение давления представлено в шестнадцатеричных значениях.

В следующем примере кода демонстрируется мониторинг барометра для изменений:

public void ToggleBarometer()
{
    if (Barometer.Default.IsSupported)
    {
        if (!Barometer.Default.IsMonitoring)
        {
            // Turn on barometer
            Barometer.Default.ReadingChanged += Barometer_ReadingChanged;
            Barometer.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off barometer
            Barometer.Default.Stop();
            Barometer.Default.ReadingChanged -= Barometer_ReadingChanged;
        }
    }
}

private void Barometer_ReadingChanged(object sender, BarometerChangedEventArgs e)
{
    // Update UI Label with barometer state
    BarometerLabel.TextColor = Colors.Green;
    BarometerLabel.Text = $"Barometer: {e.Reading}";
}

Сведения о конкретной платформе (Барометр)

В этом разделе описываются сведения о реализации для конкретной платформы, связанные с датчиком барометра.

Нет особенностей реализации для платформы.

Compass

Датчик компаса отслеживает магнитный северный заголовок устройства.

Интерфейс ICompass предоставляет доступ к датчику и доступен через Compass.Default свойство. Интерфейс ICompass и Compass класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Чтобы начать мониторинг датчика компаса, вызовите ICompass.Start метод. .NET MAUI вызывает ICompass.ReadingChanged событие при изменении заголовка компаса. ICompass.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга компаса со ICompass.IsMonitoring свойством, которое будет true выполняться, если компас в настоящее время отслеживается.

В следующем примере кода демонстрируется мониторинг компаса для изменений:

private void ToggleCompass()
{
    if (Compass.Default.IsSupported)
    {
        if (!Compass.Default.IsMonitoring)
        {
            // Turn on compass
            Compass.Default.ReadingChanged += Compass_ReadingChanged;
            Compass.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off compass
            Compass.Default.Stop();
            Compass.Default.ReadingChanged -= Compass_ReadingChanged;
        }
    }
}

private void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
{
    // Update UI Label with compass state
    CompassLabel.TextColor = Colors.Green;
    CompassLabel.Text = $"Compass: {e.Reading}";
}

Сведения для конкретной платформы (Compass)

В этом разделе описываются сведения о реализации для конкретной платформы, связанные с функцией компаса.

Android не предоставляет API для получения заголовка компаса. .NET MAUI использует акселерометр и датчики магнитометра для вычисления магнитного северного заголовка, который рекомендуется Google.

В редких случаях вы, возможно, видите несогласованные результаты, так как датчики должны быть откалибрированы. Пересчет компаса на Android зависит от модели телефона и версии Android. Вам потребуется выполнить поиск в Интернете по настройке компаса. Ниже приведены две ссылки, которые могут помочь в повторном анализе компаса:

Одновременное выполнение нескольких датчиков из приложения может привести к превышению скорости датчика.

Фильтр Lowpass

Из-за того, как обновляются и вычисляются значения компаса Android, может потребоваться сгладить значения. Фильтр Lowpass можно применить, в котором средние значения синуса и косинуса углов и могут быть включены с помощью Start перегрузки метода, которая принимает bool applyLowPassFilter параметр:

Compass.Default.Start(SensorSpeed.UI, applyLowPassFilter: true);

Это применяется только на платформе Android, и параметр игнорируется в iOS и Windows. Дополнительные сведения об этом см. в комментарии к проблеме на GitHub.

Встряхнуть

Несмотря на то, что эта статья перечисляет встряхнуть как датчик, это не так. Акселерометр используется для обнаружения того, когда устройство встряхнуло.

Интерфейс IAccelerometer предоставляет доступ к датчику и доступен через Accelerometer.Default свойство. Интерфейс IAccelerometer и Accelerometer класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Примечание.

Если приложению необходимо собрать данные датчика акселерометра Fastest с помощью скорости датчика, необходимо объявить HIGH_SAMPLING_RATE_SENSORS разрешение. Дополнительные сведения см . в разделе Accelerometer.

Для обнаружения тряски API использует необработанные показания акселерометра для вычисления ускорения. Он использует простой механизм очереди для определения того, произошло ли 3/4 последних событий акселерометра за последнюю половину секунды. Ускорение вычисляется путем добавления квадрата акселерометра X, Y и Z ($x^2+y^2+z^2$) и сравнения его с определенным пороговым значением.

Чтобы начать мониторинг датчика акселерометра, вызовите IAccelerometer.Start метод. При обнаружении IAccelerometer.ShakeDetected встряхивания событие вызывается. IAccelerometer.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга акселерометра со IAccelerometer.IsMonitoring свойством, которое будет true выполняться, если акселерометр был запущен и в настоящее время отслеживается.

Рекомендуется использовать Game или быстрее для .SensorSpeed

В следующем примере кода демонстрируется мониторинг акселерометра ShakeDetected для события:

private void ToggleShake()
{
    if (Accelerometer.Default.IsSupported)
    {
        if (!Accelerometer.Default.IsMonitoring)
        {
            // Turn on accelerometer
            Accelerometer.Default.ShakeDetected += Accelerometer_ShakeDetected;
            Accelerometer.Default.Start(SensorSpeed.Game);
        }
        else
        {
            // Turn off accelerometer
            Accelerometer.Default.Stop();
            Accelerometer.Default.ShakeDetected -= Accelerometer_ShakeDetected;
        }
    }
}

private void Accelerometer_ShakeDetected(object sender, EventArgs e)
{
    // Update UI Label with a "shaked detected" notice, in a randomized color
    ShakeLabel.TextColor = new Color(Random.Shared.Next(256), Random.Shared.Next(256), Random.Shared.Next(256));
    ShakeLabel.Text = $"Shake detected";
}

Сведения для конкретной платформы (Shake)

Нет сведений о конкретной платформе, связанных с датчиком акселерометра.

Гироскоп

Датчик gyro область измеряет скорость поворота углов вокруг трех основных осей устройства.

Интерфейс IGyroscope предоставляет доступ к датчику и доступен через Gyroscope.Default свойство. Интерфейс IGyroscope и Gyroscope класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Начать

Для доступа к функциям gyro область может потребоваться следующая настройка для конкретной платформы:

Если приложение предназначено для Android 12+ (API 31+), система устанавливает ограничение на 200 Гц на частоту обновления данных этого датчика. Если приложение должно собирать данные датчика Fastest с помощью скорости датчика, необходимо объявить HIGH_SAMPLING_RATE_SENSORS разрешение. Разрешение можно настроить следующим образом:

  • Добавьте разрешение на основе сборки:

    Откройте файл Platform/Android/MainApplication.cs и добавьте следующий атрибут сборки после using директив:

    [assembly: UsesPermission(Android.Manifest.Permission.HighSamplingRateSensors)]
    

    - или -

  • Обновите манифест Android:

    Откройте файл Platform/Android/AndroidManifest.xml и добавьте в узел следующую строкуmanifest:

    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
    

    - или -

  • Обновите манифест Android в редакторе манифеста:

    В Visual Studio дважды щелкните файл Platform/Android/AndroidManifest.xml , чтобы открыть редактор манифеста Android. Затем в разделе "Необходимые разрешения" проверка разрешения HIGH_SAMPLING_RATE_SENSORS. Это действие автоматически обновляет файл AndroidManifest.xml.

Примечание.

Если пользователь отключает доступ к микрофону с помощью переключателей устройства, датчики движения и положения всегда ограничены скоростью, независимо от того, объявляется HIGH_SAMPLING_RATE_SENSORS ли разрешение.

Мониторинг датчика gyro область

Чтобы начать мониторинг датчика gyro область, вызовите IGyroscope.Start метод. .NET MAUI отправляет гиро область изменения данных в приложение, вызвав IGyroscope.ReadingChanged событие. Данные, предоставляемые этим событием, измеряются в радиа/с (радиан в секунду). IGyroscope.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга gyro область со IGyroscope.IsMonitoring свойством, которое будет true выполняться, если был запущен gyro область и в настоящее время отслеживается.

В следующем примере кода демонстрируется мониторинг gyro область:

private void ToggleGyroscope()
{
    if (Gyroscope.Default.IsSupported)
    {
        if (!Gyroscope.Default.IsMonitoring)
        {
            // Turn on gyroscope
            Gyroscope.Default.ReadingChanged += Gyroscope_ReadingChanged;
            Gyroscope.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off gyroscope
            Gyroscope.Default.Stop();
            Gyroscope.Default.ReadingChanged -= Gyroscope_ReadingChanged;
        }
    }
}

private void Gyroscope_ReadingChanged(object sender, GyroscopeChangedEventArgs e)
{
    // Update UI Label with gyroscope state
    GyroscopeLabel.TextColor = Colors.Green;
    GyroscopeLabel.Text = $"Gyroscope: {e.Reading}";
}

Сведения для конкретной платформы (Gyro область)

Нет сведений о конкретной платформе, связанных с датчиком gyro область.

Magnetometer

Датчик магнитометра указывает ориентацию устройства относительно магнитного поля Земли.

Интерфейс IMagnetometer предоставляет доступ к датчику и доступен через Magnetometer.Default свойство. Интерфейс IMagnetometer и Magnetometer класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Начать

Чтобы получить доступ к функциям магнитометра, может потребоваться следующая настройка для конкретной платформы:

Если приложение предназначено для Android 12+ (API 31+), система устанавливает ограничение на 200 Гц на частоту обновления данных этого датчика. Если приложение должно собирать данные датчика Fastest с помощью скорости датчика, необходимо объявить HIGH_SAMPLING_RATE_SENSORS разрешение. Разрешение можно настроить следующим образом:

  • Добавьте разрешение на основе сборки:

    Откройте файл Platform/Android/MainApplication.cs и добавьте следующий атрибут сборки после using директив:

    [assembly: UsesPermission(Android.Manifest.Permission.HighSamplingRateSensors)]
    

    - или -

  • Обновите манифест Android:

    Откройте файл Platform/Android/AndroidManifest.xml и добавьте в узел следующую строкуmanifest:

    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
    

    - или -

  • Обновите манифест Android в редакторе манифеста:

    В Visual Studio дважды щелкните файл Platform/Android/AndroidManifest.xml , чтобы открыть редактор манифеста Android. Затем в разделе "Необходимые разрешения" проверка разрешения HIGH_SAMPLING_RATE_SENSORS. Это действие автоматически обновляет файл AndroidManifest.xml.

Примечание.

Если пользователь отключает доступ к микрофону с помощью переключателей устройства, датчики движения и положения всегда ограничены скоростью, независимо от того, объявляется HIGH_SAMPLING_RATE_SENSORS ли разрешение.

Мониторинг датчика магнитометра

Чтобы начать мониторинг датчика магнитометра, вызовите IMagnetometer.Start метод. .NET MAUI отправляет в приложение изменения данных магнитометра IMagnetometer.ReadingChanged , вызывая событие. Данные, предоставляемые этим событием, измеряются в $μT$ (микротеслас). IMagnetometer.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга магнитометра со IMagnetometer.IsMonitoring свойством, которое будет true происходить, если магнитометр был запущен и в настоящее время отслеживается.

В следующем примере кода демонстрируется мониторинг магнитометра:

private void ToggleMagnetometer()
{
    if (Magnetometer.Default.IsSupported)
    {
        if (!Magnetometer.Default.IsMonitoring)
        {
            // Turn on magnetometer
            Magnetometer.Default.ReadingChanged += Magnetometer_ReadingChanged;
            Magnetometer.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off magnetometer
            Magnetometer.Default.Stop();
            Magnetometer.Default.ReadingChanged -= Magnetometer_ReadingChanged;
        }
    }
}

private void Magnetometer_ReadingChanged(object sender, MagnetometerChangedEventArgs e)
{
    // Update UI Label with magnetometer state
    MagnetometerLabel.TextColor = Colors.Green;
    MagnetometerLabel.Text = $"Magnetometer: {e.Reading}";
}

Сведения для конкретной платформы (Магнитометр)

Нет сведений о конкретной платформе, связанных с датчиком магнитометра.

Ориентация

Датчик ориентации отслеживает ориентацию устройства в трехмерном пространстве.

Примечание.

Этот датчик не используется для определения того, находится ли экран видео устройства в книжном или альбомном режиме. Вместо него используйте свойство DeviceDisplay.Current.MainDisplayInfo.Orientation. Дополнительные сведения см. в разделе "Сведения о отображении устройства".

Интерфейс IOrientationSensor предоставляет доступ к датчику и доступен через OrientationSensor.Default свойство. Интерфейс IOrientationSensor и OrientationSensor класс содержатся в Microsoft.Maui.Devices.Sensors пространстве имен.

Чтобы начать мониторинг датчика IOrientationSensor.Start ориентации, вызовите метод. В .NET MAUI данные ориентации отправляются в приложение, вызывая IOrientationSensor.ReadingChanged событие. IOrientationSensor.Stop Используйте метод для остановки мониторинга датчика. Вы можете определить состояние мониторинга ориентации со IOrientationSensor.IsMonitoring свойством, которое будет true выполняться, если ориентация была запущена и в настоящее время отслеживается.

В следующем примере кода демонстрируется мониторинг датчика ориентации:

private void ToggleOrientation()
{
    if (OrientationSensor.Default.IsSupported)
    {
        if (!OrientationSensor.Default.IsMonitoring)
        {
            // Turn on orientation
            OrientationSensor.Default.ReadingChanged += Orientation_ReadingChanged;
            OrientationSensor.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off orientation
            OrientationSensor.Default.Stop();
            OrientationSensor.Default.ReadingChanged -= Orientation_ReadingChanged;
        }
    }
}

private void Orientation_ReadingChanged(object sender, OrientationSensorChangedEventArgs e)
{
    // Update UI Label with orientation state
    OrientationLabel.TextColor = Colors.Green;
    OrientationLabel.Text = $"Orientation: {e.Reading}";
}

Показания IOrientationSensor возвращаются в виде Quaternionс описанием ориентации устройства в двух трехмерных системах координат:

Устройство (обычно это телефон или планшет) использует трехмерную систему координат со следующими осями:

  • Положительная ось X указывает справа от дисплея в книжном режиме.
  • Положительная ось Y указывает на верхнюю часть устройства в книжном режиме.
  • Положительная ось Z указывает на экран.

Трехмерная система координат относительно Земли имеет следующие оси:

  • Положительная ось X касается поверхности Земли и указывает на восток.
  • Положительная ось Y также касается поверхности Земли и указывает на север.
  • Положительная ось Z является перпендикулярной к поверхности Земли и указывает вверх.

Quaternion описывает вращение системы координат устройства по отношению к системе координат Земли.

Quaternion Значение тесно связано с поворотом вокруг оси. Если ось поворота является нормализованным вектором ($a_x, a_y, a_z$), а угол поворота — $\theta$, то компоненты (X, Y, Z, W) кватерниона:

$(a_x \times \sin(\theta/2), a_y \times \sin(\theta/2), a_z \times \sin(\theta/2), \cos(\theta/2)$

Это правосторонние системы координат: если направить большой палец правой руки в направлении положительного изменения координат по оси вращения, изгиб пальцев будет указывать направление вращения с положительным значением угла поворота.

Примеры:

  • Если устройство лежит горизонтально на столе экраном вверх и при этом верхний край устройства (в книжной ориентации) указывает на север, эти системы координат совпадают. Значение Quaternion представляет единичный кватернион (0, 0, 0, 1). Все повороты можно анализировать относительно этой позиции.

  • Если устройство лежит горизонтально на столе экраном вверх и при этом верхний край устройства (в книжной ориентации) указывает на запад, Quaternion принимает значение (0, 0, 0,707, 0,707). Это означает, что устройство повернуто на 90 градусов вокруг оси Z в системе координат Земли.

  • Когда устройство удерживается вертикально так, что его верхняя часть (в книжной ориентации) направлена вверх, к небу, а задняя панель устройства расположена с северной стороны, устройство считается повернутым на 90 градусов вокруг оси X. Значение Quaternion равно (0,707, 0, 0, 0,707).

  • Если устройство расположено так, чтобы его левый край находится на таблице, а верхние точки на север, устройство было вращено -90 градусов вокруг оси Y (или 90 градусов вокруг отрицательной оси Y). Значение Quaternion равно (0, -0,707, 0, 0,707).

Сведения о конкретной платформе (ориентация)

Нет сведений о конкретной платформе, связанных с датчиком ориентации.