From 2c866cc1b2b910060148dbc3b4d091edad9af4b5 Mon Sep 17 00:00:00 2001 From: 6y Date: Thu, 23 Nov 2023 09:48:35 +0800 Subject: [PATCH] fix(sensors_plus): Add protection of reserved samplingPeriod value --- .../lib/src/method_channel_sensors.dart | 53 ++++++++++++++++--- .../pubspec.yaml | 1 + 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart index 244c647647..442c5fa151 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:flutter/services.dart'; +import 'package:logging/logging.dart'; import 'package:sensors_plus_platform_interface/sensors_plus_platform_interface.dart'; /// A method channel -based implementation of the SensorsPlatform interface. @@ -24,6 +25,7 @@ class MethodChannelSensors extends SensorsPlatform { static const EventChannel _magnetometerEventChannel = EventChannel('dev.fluttercommunity.plus/sensors/magnetometer'); + final logger = Logger('MethodChannelSensors'); Stream? _accelerometerEvents; Stream? _gyroscopeEvents; Stream? _userAccelerometerEvents; @@ -35,8 +37,17 @@ class MethodChannelSensors extends SensorsPlatform { Stream accelerometerEventStream({ Duration samplingPeriod = SensorInterval.normalInterval, }) { - _methodChannel.invokeMethod( - 'setAccelerationSamplingPeriod', samplingPeriod.inMicroseconds); + var microseconds = samplingPeriod.inMicroseconds; + if (microseconds >= 1 && microseconds <= 3) { + logger.warning('The SamplingPeriod is currently set to $microsecondsμs, ' + 'which is a reserved value in Android. Please consider changing it ' + 'to either 0 or 4μs. See https://developer.android.com/reference/' + 'android/hardware/SensorManager#registerListener(android.hardware.' + 'SensorEventListener,%20android.hardware.Sensor,%20int) for more ' + 'information'); + microseconds = 0; + } + _methodChannel.invokeMethod('setAccelerationSamplingPeriod', microseconds); _accelerometerEvents ??= _accelerometerEventChannel .receiveBroadcastStream() .map((dynamic event) { @@ -52,8 +63,17 @@ class MethodChannelSensors extends SensorsPlatform { Stream gyroscopeEventStream({ Duration samplingPeriod = SensorInterval.normalInterval, }) { - _methodChannel.invokeMethod( - 'setGyroscopeSamplingPeriod', samplingPeriod.inMicroseconds); + var microseconds = samplingPeriod.inMicroseconds; + if (microseconds >= 1 && microseconds <= 3) { + logger.warning('The SamplingPeriod is currently set to $microsecondsμs, ' + 'which is a reserved value in Android. Please consider changing it ' + 'to either 0 or 4μs. See https://developer.android.com/reference/' + 'android/hardware/SensorManager#registerListener(android.hardware.' + 'SensorEventListener,%20android.hardware.Sensor,%20int) for more ' + 'information'); + microseconds = 0; + } + _methodChannel.invokeMethod('setGyroscopeSamplingPeriod', microseconds); _gyroscopeEvents ??= _gyroscopeEventChannel.receiveBroadcastStream().map((dynamic event) { final list = event.cast(); @@ -68,8 +88,18 @@ class MethodChannelSensors extends SensorsPlatform { Stream userAccelerometerEventStream({ Duration samplingPeriod = SensorInterval.normalInterval, }) { + var microseconds = samplingPeriod.inMicroseconds; + if (microseconds >= 1 && microseconds <= 3) { + logger.warning('The SamplingPeriod is currently set to $microsecondsμs, ' + 'which is a reserved value in Android. Please consider changing it ' + 'to either 0 or 4μs. See https://developer.android.com/reference/' + 'android/hardware/SensorManager#registerListener(android.hardware.' + 'SensorEventListener,%20android.hardware.Sensor,%20int) for more ' + 'information'); + microseconds = 0; + } _methodChannel.invokeMethod( - 'setUserAccelerometerSamplingPeriod', samplingPeriod.inMicroseconds); + 'setUserAccelerometerSamplingPeriod', microseconds); _userAccelerometerEvents ??= _userAccelerometerEventChannel .receiveBroadcastStream() .map((dynamic event) { @@ -85,8 +115,17 @@ class MethodChannelSensors extends SensorsPlatform { Stream magnetometerEventStream({ Duration samplingPeriod = SensorInterval.normalInterval, }) { - _methodChannel.invokeMethod( - 'setMagnetometerSamplingPeriod', samplingPeriod.inMicroseconds); + var microseconds = samplingPeriod.inMicroseconds; + if (microseconds >= 1 && microseconds <= 3) { + logger.warning('The SamplingPeriod is currently set to $microsecondsμs, ' + 'which is a reserved value in Android. Please consider changing it ' + 'to either 0 or 4μs. See https://developer.android.com/reference/' + 'android/hardware/SensorManager#registerListener(android.hardware.' + 'SensorEventListener,%20android.hardware.Sensor,%20int) for more ' + 'information'); + microseconds = 0; + } + _methodChannel.invokeMethod('setMagnetometerSamplingPeriod', microseconds); _magnetometerEvents ??= _magnetometerEventChannel.receiveBroadcastStream().map((dynamic event) { final list = event.cast(); diff --git a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml index 062db0ca1b..a5d06d1ea6 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml @@ -7,6 +7,7 @@ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ dependencies: flutter: sdk: flutter + logging: ^1.2.0 meta: ^1.8.0 plugin_platform_interface: ^2.1.4