1
1
package io .pslab ;
2
2
3
+ import android .content .Context ;
4
+ import android .hardware .Sensor ;
5
+ import android .hardware .SensorEvent ;
6
+ import android .hardware .SensorEventListener ;
7
+ import android .hardware .SensorManager ;
8
+ import android .os .Bundle ;
9
+ import android .util .Log ;
10
+
11
+ import androidx .annotation .NonNull ;
12
+
3
13
import io .flutter .embedding .android .FlutterActivity ;
14
+ import io .flutter .embedding .engine .FlutterEngine ;
15
+ import io .flutter .plugin .common .EventChannel ;
16
+ import io .flutter .plugin .common .MethodCall ;
17
+ import io .flutter .plugin .common .MethodChannel ;
18
+
19
+ public class MainActivity extends FlutterActivity implements SensorEventListener {
20
+ private static final String TEMPERATURE_CHANNEL = "io.pslab/temperature" ;
21
+ private static final String TEMPERATURE_STREAM = "io.pslab/temperature_stream" ;
22
+ private static final String TAG = "MainActivity" ;
23
+ private SensorManager sensorManager ;
24
+ private Sensor temperatureSensor ;
25
+ private EventChannel .EventSink temperatureEventSink ;
26
+ private boolean isListening = false ;
27
+ private float currentTemperature = 0.0f ;
28
+
29
+ @ Override
30
+ public void configureFlutterEngine (@ NonNull FlutterEngine flutterEngine ) {
31
+ super .configureFlutterEngine (flutterEngine );
32
+
33
+ sensorManager = (SensorManager ) getSystemService (Context .SENSOR_SERVICE );
34
+ if (sensorManager != null ) {
35
+ temperatureSensor = sensorManager .getDefaultSensor (Sensor .TYPE_AMBIENT_TEMPERATURE );
36
+ }
37
+
38
+ MethodChannel temperatureChannel = new MethodChannel (flutterEngine .getDartExecutor ().getBinaryMessenger (), TEMPERATURE_CHANNEL );
39
+ temperatureChannel .setMethodCallHandler (this ::handleMethodCall );
40
+
41
+ EventChannel temperatureEventChannel = new EventChannel (flutterEngine .getDartExecutor ().getBinaryMessenger (), TEMPERATURE_STREAM );
42
+ temperatureEventChannel .setStreamHandler (new EventChannel .StreamHandler () {
43
+ @ Override
44
+ public void onListen (Object arguments , EventChannel .EventSink events ) {
45
+ temperatureEventSink = events ;
46
+ startTemperatureUpdates ();
47
+ }
48
+
49
+ @ Override
50
+ public void onCancel (Object arguments ) {
51
+ temperatureEventSink = null ;
52
+ stopTemperatureUpdates ();
53
+ }
54
+ });
55
+ }
56
+
57
+ private void handleMethodCall (MethodCall call , MethodChannel .Result result ) {
58
+ switch (call .method ) {
59
+ case "isTemperatureSensorAvailable" :
60
+ result .success (temperatureSensor != null );
61
+ break ;
62
+ case "getCurrentTemperature" :
63
+ result .success ((double ) currentTemperature );
64
+ break ;
65
+ case "startTemperatureUpdates" :
66
+ if (startTemperatureUpdates ()) {
67
+ result .success (true );
68
+ } else {
69
+ result .error ("SENSOR_ERROR" , "Failed to start temperature updates" , null );
70
+ }
71
+ break ;
72
+ case "stopTemperatureUpdates" :
73
+ stopTemperatureUpdates ();
74
+ result .success (true );
75
+ break ;
76
+ default :
77
+ result .notImplemented ();
78
+ break ;
79
+ }
80
+ }
81
+
82
+ private boolean startTemperatureUpdates () {
83
+ if (temperatureSensor == null || sensorManager == null ) {
84
+ Log .e (TAG , "Temperature sensor not available" );
85
+ return false ;
86
+ }
87
+
88
+ if (!isListening ) {
89
+ boolean registered = sensorManager .registerListener (this , temperatureSensor , SensorManager .SENSOR_DELAY_NORMAL );
90
+ if (registered ) {
91
+ isListening = true ;
92
+ Log .d (TAG , "Temperature sensor listener registered" );
93
+
94
+ if (currentTemperature != 0.0f && temperatureEventSink != null ) {
95
+ Log .d (TAG , "Sending initial temperature to Flutter: " + currentTemperature );
96
+ temperatureEventSink .success ((double ) currentTemperature );
97
+ }
98
+
99
+ return true ;
100
+ } else {
101
+ Log .e (TAG , "Failed to register temperature sensor listener" );
102
+ return false ;
103
+ }
104
+ }
105
+ return true ;
106
+ }
107
+
108
+ private void stopTemperatureUpdates () {
109
+ if (isListening && sensorManager != null ) {
110
+ sensorManager .unregisterListener (this , temperatureSensor );
111
+ isListening = false ;
112
+ Log .d (TAG , "Temperature sensor listener unregistered" );
113
+ }
114
+ }
115
+
116
+ @ Override
117
+ public void onSensorChanged (SensorEvent event ) {
118
+ if (event .sensor .getType () == Sensor .TYPE_AMBIENT_TEMPERATURE ) {
119
+ float temperature = event .values [0 ];
120
+
121
+ if (isValidTemperature (temperature )) {
122
+ currentTemperature = temperature ;
123
+ Log .d (TAG , "Temperature updated: " + currentTemperature + "°C" );
124
+
125
+ if (temperatureEventSink != null ) {
126
+ Log .d (TAG , "Sending temperature to Flutter: " + currentTemperature );
127
+ temperatureEventSink .success ((double ) currentTemperature );
128
+ }
129
+ } else {
130
+ Log .w (TAG , "Invalid temperature reading: " + temperature + " - ignoring" );
131
+ }
132
+ }
133
+ }
134
+
135
+ private boolean isValidTemperature (float temperature ) {
136
+ if (Float .isNaN (temperature ) || Float .isInfinite (temperature )) return false ;
137
+ return temperature >= -273.15f && temperature <= 200f && Math .abs (temperature ) <= 1e10f ;
138
+ }
139
+
140
+ @ Override
141
+ public void onAccuracyChanged (Sensor sensor , int accuracy ) {
142
+ Log .d (TAG , "Sensor accuracy changed: " + accuracy );
143
+ }
144
+
145
+ @ Override
146
+ protected void onDestroy () {
147
+ super .onDestroy ();
148
+ stopTemperatureUpdates ();
149
+ }
150
+
151
+ @ Override
152
+ protected void onPause () {
153
+ super .onPause ();
154
+ if (isListening && sensorManager != null ) {
155
+ sensorManager .unregisterListener (this );
156
+ }
157
+ }
4
158
5
- public class MainActivity extends FlutterActivity {
6
- }
159
+ @ Override
160
+ protected void onResume () {
161
+ super .onResume ();
162
+ if (isListening && temperatureSensor != null && sensorManager != null ) {
163
+ sensorManager .registerListener (this , temperatureSensor , SensorManager .SENSOR_DELAY_NORMAL );
164
+ }
165
+ }
166
+ }
0 commit comments