diff --git a/README.md b/README.md
index 980bc7c570..6a913c1d42 100644
--- a/README.md
+++ b/README.md
@@ -125,7 +125,7 @@ package, such as CFBundleVersion on iOS or versionCode on Android.
> [![sensors_plus][sensors_plus_badge_pub]][sensors_plus] [![pub points][sensors_plus_badge_pub_points]][sensors_plus_pub_points]
-Flutter plugin for accessing accelerometer, gyroscope, and magnetometer sensors.
+Flutter plugin for accessing accelerometer, gyroscope, magnetometer and barometer sensors.
[[View Source][sensors_plus_code]]
diff --git a/packages/sensors_plus/sensors_plus/README.md b/packages/sensors_plus/sensors_plus/README.md
index 41696c0ef2..f8bc215980 100644
--- a/packages/sensors_plus/sensors_plus/README.md
+++ b/packages/sensors_plus/sensors_plus/README.md
@@ -6,8 +6,8 @@
[
](https://flutter.dev/docs/development/packages-and-plugins/favorites)
-A Flutter plugin to access the accelerometer, gyroscope, and magnetometer
-sensors.
+A Flutter plugin to access the accelerometer, gyroscope, magnetometer and
+barometer sensors.
## Platform Support
@@ -54,9 +54,11 @@ This will expose such classes of sensor events through a set of streams:
- `GyroscopeEvent` describes the rotation of the device.
- `MagnetometerEvent` describes the ambient magnetic field surrounding the
device. A compass is an example usage of this data.
+- `BarometerEvent` describes the atmospheric pressure surrounding the device.
+ An altimeter is an example usage of this data. Not supported on web browsers.
These events are exposed through a `BroadcastStream`: `accelerometerEvents`,
-`userAccelerometerEvents`, `gyroscopeEvents`, and `magnetometerEvents`,
+`userAccelerometerEvents`, `gyroscopeEvents`, `magnetometerEvents`, and `barometerEvents`,
respectively.
> [!NOTE]
@@ -116,6 +118,18 @@ magnetometerEvents.listen(
cancelOnError: true,
);
// [MagnetometerEvent (x: -23.6, y: 6.2, z: -34.9)]
+
+barometerEvents.listen(
+ (BarometerEvent event) {
+ print(event);
+ },
+ onError: (error) {
+ // Logic to handle error
+ // Needed for Android in case sensor is not available
+ },
+ cancelOnError: true,
+);
+// [BarometerEvent (pressure: 1000.0)]
```
Alternatively, every stream allows to specify the sampling rate for its sensor using one of predefined constants or using a custom value
diff --git a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt
index 52c4da1890..3436670795 100644
--- a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt
+++ b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt
@@ -17,11 +17,13 @@ class SensorsPlugin : FlutterPlugin {
private lateinit var userAccelChannel: EventChannel
private lateinit var gyroscopeChannel: EventChannel
private lateinit var magnetometerChannel: EventChannel
+ private lateinit var barometerChannel: EventChannel
private lateinit var accelerometerStreamHandler: StreamHandlerImpl
private lateinit var userAccelStreamHandler: StreamHandlerImpl
private lateinit var gyroscopeStreamHandler: StreamHandlerImpl
private lateinit var magnetometerStreamHandler: StreamHandlerImpl
+ private lateinit var barometerStreamHandler: StreamHandlerImpl
override fun onAttachedToEngine(binding: FlutterPluginBinding) {
setupMethodChannel(binding.binaryMessenger)
@@ -41,6 +43,7 @@ class SensorsPlugin : FlutterPlugin {
"setUserAccelerometerSamplingPeriod" -> userAccelStreamHandler
"setGyroscopeSamplingPeriod" -> gyroscopeStreamHandler
"setMagnetometerSamplingPeriod" -> magnetometerStreamHandler
+ "setBarometerSamplingPeriod" -> barometerStreamHandler
else -> null
}
streamHandler?.samplingPeriod = call.arguments as Int
@@ -86,6 +89,13 @@ class SensorsPlugin : FlutterPlugin {
Sensor.TYPE_MAGNETIC_FIELD
)
magnetometerChannel.setStreamHandler(magnetometerStreamHandler)
+
+ barometerChannel = EventChannel(messenger, BAROMETER_CHANNEL_NAME)
+ barometerStreamHandler = StreamHandlerImpl(
+ sensorsManager,
+ Sensor.TYPE_PRESSURE
+ )
+ barometerChannel.setStreamHandler(barometerStreamHandler)
}
private fun teardownEventChannels() {
@@ -93,11 +103,13 @@ class SensorsPlugin : FlutterPlugin {
userAccelChannel.setStreamHandler(null)
gyroscopeChannel.setStreamHandler(null)
magnetometerChannel.setStreamHandler(null)
+ barometerChannel.setStreamHandler(null)
accelerometerStreamHandler.onCancel(null)
userAccelStreamHandler.onCancel(null)
gyroscopeStreamHandler.onCancel(null)
magnetometerStreamHandler.onCancel(null)
+ barometerStreamHandler.onCancel(null)
}
companion object {
@@ -111,5 +123,7 @@ class SensorsPlugin : FlutterPlugin {
"dev.fluttercommunity.plus/sensors/user_accel"
private const val MAGNETOMETER_CHANNEL_NAME =
"dev.fluttercommunity.plus/sensors/magnetometer"
+ private const val BAROMETER_CHANNEL_NAME =
+ "dev.fluttercommunity.plus/sensors/barometer"
}
}
diff --git a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt
index 54669e2b39..ffbfefee1f 100644
--- a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt
+++ b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt
@@ -55,6 +55,7 @@ internal class StreamHandlerImpl(
Sensor.TYPE_LINEAR_ACCELERATION -> "User Accelerometer"
Sensor.TYPE_GYROSCOPE -> "Gyroscope"
Sensor.TYPE_MAGNETIC_FIELD -> "Magnetometer"
+ Sensor.TYPE_PRESSURE -> "Barometer"
else -> "Undefined"
}
}
diff --git a/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist b/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist
index 59163fe712..72a51b61b5 100644
--- a/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist
+++ b/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist
@@ -24,6 +24,10 @@
$(FLUTTER_BUILD_NUMBER)
LSRequiresIPhoneOS
+ NSMotionUsageDescription
+ This app requires access to motion data as an example for the sensors plugin.
+ UIApplicationSupportsIndirectInputEvents
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
diff --git a/packages/sensors_plus/sensors_plus/example/lib/main.dart b/packages/sensors_plus/sensors_plus/example/lib/main.dart
index 67ab098cd9..f3334a3840 100644
--- a/packages/sensors_plus/sensors_plus/example/lib/main.dart
+++ b/packages/sensors_plus/sensors_plus/example/lib/main.dart
@@ -60,16 +60,19 @@ class _MyHomePageState extends State {
AccelerometerEvent? _accelerometerEvent;
GyroscopeEvent? _gyroscopeEvent;
MagnetometerEvent? _magnetometerEvent;
+ BarometerEvent? _barometerEvent;
DateTime? _userAccelerometerUpdateTime;
DateTime? _accelerometerUpdateTime;
DateTime? _gyroscopeUpdateTime;
DateTime? _magnetometerUpdateTime;
+ DateTime? _barometerUpdateTime;
int? _userAccelerometerLastInterval;
int? _accelerometerLastInterval;
int? _gyroscopeLastInterval;
int? _magnetometerLastInterval;
+ int? _barometerLastInterval;
final _streamSubscriptions = >[];
Duration sensorInterval = SensorInterval.normalInterval;
@@ -101,7 +104,7 @@ class _MyHomePageState extends State {
),
),
Padding(
- padding: const EdgeInsets.all(20.0),
+ padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0),
child: Table(
columnWidths: const {
0: FlexColumnWidth(4),
@@ -169,6 +172,35 @@ class _MyHomePageState extends State {
],
),
),
+ Padding(
+ padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 20.0),
+ child: Table(
+ columnWidths: const {
+ 0: FlexColumnWidth(4),
+ 1: FlexColumnWidth(3),
+ 2: FlexColumnWidth(2),
+ },
+ children: [
+ const TableRow(
+ children: [
+ SizedBox.shrink(),
+ Text('Pressure'),
+ Text('Interval'),
+ ],
+ ),
+ TableRow(
+ children: [
+ const Padding(
+ padding: EdgeInsets.symmetric(vertical: 8.0),
+ child: Text('Barometer'),
+ ),
+ Text(_barometerEvent?.pressure.toStringAsFixed(1) ?? '?'),
+ Text('${_barometerLastInterval?.toString() ?? '?'} ms'),
+ ],
+ ),
+ ],
+ ),
+ ),
Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -209,6 +241,7 @@ class _MyHomePageState extends State {
accelerometerEventStream(samplingPeriod: sensorInterval);
gyroscopeEventStream(samplingPeriod: sensorInterval);
magnetometerEventStream(samplingPeriod: sensorInterval);
+ barometerEventStream(samplingPeriod: sensorInterval);
});
},
),
@@ -346,5 +379,34 @@ class _MyHomePageState extends State {
cancelOnError: true,
),
);
+ _streamSubscriptions.add(
+ barometerEventStream(samplingPeriod: sensorInterval).listen(
+ (BarometerEvent event) {
+ final now = DateTime.now();
+ setState(() {
+ _barometerEvent = event;
+ if (_barometerUpdateTime != null) {
+ final interval = now.difference(_barometerUpdateTime!);
+ if (interval > _ignoreDuration) {
+ _barometerLastInterval = interval.inMilliseconds;
+ }
+ }
+ });
+ _barometerUpdateTime = now;
+ },
+ onError: (e) {
+ showDialog(
+ context: context,
+ builder: (context) {
+ return const AlertDialog(
+ title: Text("Sensor Not Found"),
+ content: Text(
+ "It seems that your device doesn't support Barometer Sensor"),
+ );
+ });
+ },
+ cancelOnError: true,
+ ),
+ );
}
}
diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift b/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift
index a31e1ec9f3..2b2695ff08 100644
--- a/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift
+++ b/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift
@@ -51,6 +51,16 @@ public class FPPSensorsPlusPlugin: NSObject, FlutterPlugin {
_eventChannels[magnetometerStreamHandlerName] = magnetometerChannel
_streamHandlers[magnetometerStreamHandlerName] = magnetometerStreamHandler
+ let barometerStreamHandler = FPPBarometerStreamHandlerPlus()
+ let barometerStreamHandlerName = "dev.fluttercommunity.plus/sensors/barometer"
+ let barometerChannel = FlutterEventChannel(
+ name: barometerStreamHandlerName,
+ binaryMessenger: registrar.messenger()
+ )
+ barometerChannel.setStreamHandler(barometerStreamHandler)
+ _eventChannels[barometerStreamHandlerName] = barometerChannel
+ _streamHandlers[barometerStreamHandlerName] = barometerStreamHandler
+
let methodChannel = FlutterMethodChannel(
name: "dev.fluttercommunity.plus/sensors/method",
binaryMessenger: registrar.messenger()
@@ -66,6 +76,8 @@ public class FPPSensorsPlusPlugin: NSObject, FlutterPlugin {
streamHandler = _streamHandlers[gyroscopeStreamHandlerName]
case "setMagnetometerSamplingPeriod":
streamHandler = _streamHandlers[magnetometerStreamHandlerName]
+ case "setBarometerSamplingPeriod":
+ streamHandler = _streamHandlers[barometerStreamHandlerName]
default:
return result(FlutterMethodNotImplemented)
}
diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift b/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift
index fa64accc40..e7b335df2d 100644
--- a/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift
+++ b/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift
@@ -9,6 +9,7 @@ import CoreMotion
let GRAVITY = 9.81
var _motionManager: CMMotionManager!
+var _altimeter: CMAltimeter!
public protocol MotionStreamHandler: FlutterStreamHandler {
var samplingPeriod: Int { get set }
@@ -24,6 +25,12 @@ func _initMotionManager() {
}
}
+func _initAltimeter() {
+ if (_altimeter == nil) {
+ _altimeter = CMAltimeter()
+ }
+}
+
func sendTriplet(x: Float64, y: Float64, z: Float64, sink: @escaping FlutterEventSink) {
if _isCleanUp {
return
@@ -219,3 +226,59 @@ class FPPMagnetometerStreamHandlerPlus: NSObject, MotionStreamHandler {
FPPSensorsPlusPlugin._cleanUp()
}
}
+
+class FPPBarometerStreamHandlerPlus: NSObject, MotionStreamHandler {
+
+ var samplingPeriod = 200000 {
+ didSet {
+ _initAltimeter()
+ // Note: CMAltimeter does not provide a way to set the sampling period directly.
+ // The sampling period would typically be managed by starting/stopping the updates.
+ }
+ }
+
+ func onListen(
+ withArguments arguments: Any?,
+ eventSink sink: @escaping FlutterEventSink
+ ) -> FlutterError? {
+ _initAltimeter()
+ if CMAltimeter.isRelativeAltitudeAvailable() {
+ _altimeter.startRelativeAltitudeUpdates(to: OperationQueue()) { data, error in
+ if _isCleanUp {
+ return
+ }
+ if (error != nil) {
+ sink(FlutterError(
+ code: "UNAVAILABLE",
+ message: error!.localizedDescription,
+ details: nil
+ ))
+ return
+ }
+ let pressure = data!.pressure.doubleValue * 10.0 // kPa to hPa (hectopascals)
+ DispatchQueue.main.async {
+ let pressureArray: [Double] = [pressure]
+ pressureArray.withUnsafeBufferPointer { buffer in
+ sink(FlutterStandardTypedData.init(float64: Data(buffer: buffer)))
+ }
+ }
+ }
+ } else {
+ return FlutterError(
+ code: "UNAVAILABLE",
+ message: "Barometer is not available on this device",
+ details: nil
+ )
+ }
+ return nil
+ }
+
+ func onCancel(withArguments arguments: Any?) -> FlutterError? {
+ _altimeter.stopRelativeAltitudeUpdates()
+ return nil
+ }
+
+ func dealloc() {
+ FPPSensorsPlusPlugin._cleanUp()
+ }
+}
diff --git a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec
index 0bdb8fd494..5665106d70 100644
--- a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec
+++ b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec
@@ -7,7 +7,7 @@ Pod::Spec.new do |s|
s.version = '0.0.1'
s.summary = 'Flutter Sensors'
s.description = <<-DESC
-Flutter plugin to access the accelerometer, gyroscope, and magnetometer sensors.
+Flutter plugin to access the accelerometer, gyroscope, magnetometer and barometer sensors.
DESC
s.homepage = 'https://github.com/fluttercommunity/plus_plugins'
s.license = { :type => 'BSD', :file => '../LICENSE' }
diff --git a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart
index 5e6d95496a..5739bb8f8b 100644
--- a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart
+++ b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart
@@ -68,3 +68,12 @@ Stream magnetometerEventStream({
}) {
return _sensors.magnetometerEventStream(samplingPeriod: samplingPeriod);
}
+
+/// Returns a broadcast stream of events from the device barometer at the
+/// given sampling frequency.
+@override
+Stream barometerEventStream({
+ Duration samplingPeriod = SensorInterval.normalInterval,
+}) {
+ return _sensors.barometerEventStream(samplingPeriod: samplingPeriod);
+}
diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart
index 520d0b4f4f..2caf36b3da 100644
--- a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart
+++ b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart
@@ -65,4 +65,17 @@ class Sensors extends SensorsPlatform {
}) {
return _platform.magnetometerEventStream(samplingPeriod: samplingPeriod);
}
+
+ /// Returns a broadcast stream of events from the device barometer at the
+ /// given sampling frequency.
+ ///
+ /// This method always returning the same stream. If this method is called
+ /// again, the sampling period of the stream will be update. All previous
+ /// listener will also be affected.
+ @override
+ Stream barometerEventStream({
+ Duration samplingPeriod = SensorInterval.normalInterval,
+ }) {
+ return _platform.barometerEventStream(samplingPeriod: samplingPeriod);
+ }
}
diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart
index 6f0b72503b..4dbc8e8723 100644
--- a/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart
+++ b/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart
@@ -67,3 +67,12 @@ Stream magnetometerEventStream({
}) {
return _sensors.magnetometerEventStream(samplingPeriod: samplingPeriod);
}
+
+/// Returns a broadcast stream of events from the device barometer at the
+/// given sampling frequency.
+@override
+Stream barometerEventStream({
+ Duration samplingPeriod = SensorInterval.normalInterval,
+}) {
+ return _sensors.barometerEventStream(samplingPeriod: samplingPeriod);
+}
diff --git a/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart
index e14b81f91e..d9b9c6badb 100644
--- a/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart
+++ b/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart
@@ -274,6 +274,15 @@ class WebSensorsPlugin extends SensorsPlatform {
return _magnetometerResultStream;
}
+
+ @override
+ Stream barometerEventStream({
+ Duration samplingPeriod = SensorInterval.normalInterval,
+ }) {
+ // The Barometer API does not exist and so is not supported by any modern browser.
+ // Therefore, we simply return an empty stream.
+ return const Stream.empty();
+ }
}
extension on Duration {
diff --git a/packages/sensors_plus/sensors_plus/test/sensors_test.dart b/packages/sensors_plus/sensors_plus/test/sensors_test.dart
index 5700a17aa8..a250c41531 100644
--- a/packages/sensors_plus/sensors_plus/test/sensors_test.dart
+++ b/packages/sensors_plus/sensors_plus/test/sensors_test.dart
@@ -62,6 +62,17 @@ void main() {
expect(event.y, sensorData[1]);
expect(event.z, sensorData[2]);
});
+
+ test('barometerEvents are streamed', () async {
+ const channelName = 'dev.fluttercommunity.plus/sensors/barometer';
+ const sensorData = [1000.0];
+ _initializeFakeMethodChannel('setBarometerSamplingPeriod');
+ _initializeFakeSensorChannel(channelName, sensorData);
+
+ final event = await barometerEventStream().first;
+
+ expect(event.pressure, sensorData[0]);
+ });
}
void _initializeFakeMethodChannel(String methodName) {
diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart
index ebfd62ef4e..a8ac66824f 100644
--- a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart
+++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart
@@ -13,11 +13,13 @@ import 'src/accelerometer_event.dart';
import 'src/gyroscope_event.dart';
import 'src/magnetometer_event.dart';
import 'src/user_accelerometer_event.dart';
+import 'src/barometer_event.dart';
export 'src/accelerometer_event.dart';
export 'src/gyroscope_event.dart';
export 'src/magnetometer_event.dart';
export 'src/user_accelerometer_event.dart';
+export 'src/barometer_event.dart';
export 'src/sensor_interval.dart';
/// The common platform interface for sensors.
@@ -102,4 +104,12 @@ abstract class SensorsPlatform extends PlatformInterface {
}) {
throw UnimplementedError('magnetometerEvents has not been implemented.');
}
+
+ /// Returns a broadcast stream of events from the device barometer at the
+ /// given sampling frequency.
+ Stream barometerEventStream({
+ Duration samplingPeriod = SensorInterval.normalInterval,
+ }) {
+ throw UnimplementedError('barometerEvents has not been implemented.');
+ }
}
diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/barometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/barometer_event.dart
new file mode 100644
index 0000000000..c87722be2f
--- /dev/null
+++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/barometer_event.dart
@@ -0,0 +1,26 @@
+/// A sensor sample from a barometer.
+///
+/// Barometers measure the atmospheric pressure surrounding the sensor,
+/// returning values in hectopascals ***hPa***.
+///
+/// Consider that these samples may be affected by altitude and weather
+/// conditions, and can be used to predict short-term weather changes or
+/// determine altitude.
+///
+/// Note that water-resistant phones or similar sealed devices may experience
+/// pressure fluctuations as the device is held or used, due to changes in
+/// pressure caused by handling the device.
+///
+/// An altimeter is an example of a general utility for barometer data.
+class BarometerEvent {
+ /// Constructs a new instance with the given [pressure] value.
+ ///
+ /// See [BarometerEvent] for more information.
+ BarometerEvent(this.pressure);
+
+ /// The atmospheric pressure surrounding the sensor in hectopascals ***hPa***.
+ final double pressure;
+
+ @override
+ String toString() => '[BarometerEvent (pressure: $pressure hPa)]';
+}
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 442c5fa151..b454096e1c 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
@@ -25,11 +25,15 @@ class MethodChannelSensors extends SensorsPlatform {
static const EventChannel _magnetometerEventChannel =
EventChannel('dev.fluttercommunity.plus/sensors/magnetometer');
+ static const EventChannel _barometerEventChannel =
+ EventChannel('dev.fluttercommunity.plus/sensors/barometer');
+
final logger = Logger('MethodChannelSensors');
Stream? _accelerometerEvents;
Stream? _gyroscopeEvents;
Stream? _userAccelerometerEvents;
Stream? _magnetometerEvents;
+ Stream? _barometerEvents;
/// Returns a broadcast stream of events from the device accelerometer at the
/// given sampling frequency.
@@ -133,4 +137,29 @@ class MethodChannelSensors extends SensorsPlatform {
});
return _magnetometerEvents!;
}
+
+ /// Returns a broadcast stream of events from the device barometer at the
+ /// given sampling frequency.
+ @override
+ Stream barometerEventStream({
+ 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('setBarometerSamplingPeriod', microseconds);
+ _barometerEvents ??=
+ _barometerEventChannel.receiveBroadcastStream().map((dynamic event) {
+ final list = event.cast();
+ return BarometerEvent(list[0]!);
+ });
+ return _barometerEvents!;
+ }
}
diff --git a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart
index f25c7186ef..05bb666499 100644
--- a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart
+++ b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart
@@ -48,6 +48,15 @@ Stream magnetometerEventStream({
return methodChannel.magnetometerEventStream(samplingPeriod: samplingPeriod);
}
+/// Returns a broadcast stream of events from the device magnetometer at the
+/// given sampling frequency.
+@override
+Stream barometerEventStream({
+ Duration samplingPeriod = SensorInterval.normalInterval,
+}) {
+ return methodChannel.barometerEventStream(samplingPeriod: samplingPeriod);
+}
+
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
@@ -102,6 +111,17 @@ void main() {
expect(event.y, sensorData[1]);
expect(event.z, sensorData[2]);
});
+
+ test('barometerEvents are streamed', () async {
+ const channelName = 'dev.fluttercommunity.plus/sensors/barometer';
+ const sensorData = [1000.0];
+ _initializeFakeMethodChannel('setBarometerSamplingPeriod');
+ _initializeFakeSensorChannel(channelName, sensorData);
+
+ final event = await barometerEventStream().first;
+
+ expect(event.pressure, sensorData[0]);
+ });
}
void _initializeFakeMethodChannel(String methodName) {