Nền tảng Android cung cấp 4 cảm biến cho phép bạn theo dõi nhiều đặc điểm môi trường. Bạn có thể dùng những cảm biến này để theo dõi độ ẩm tương đối của môi trường xung quanh, độ chói, áp suất xung quanh và nhiệt độ môi trường xung quanh ở gần thiết bị chạy Android. Cả 4 cảm biến môi trường đều dựa trên phần cứng và chỉ dùng được nếu nhà sản xuất thiết bị đã tích hợp các API này vào thiết bị. Ngoại trừ cảm biến ánh sáng mà hầu hết các nhà sản xuất thiết bị sử dụng để kiểm soát độ sáng màn hình, môi trường cảm biến không phải lúc nào cũng có sẵn trên thiết bị. Do đó, điều đặc biệt quan trọng là bạn phải xác minh xem cảm biến môi trường có tồn tại hay không trước khi bạn cố gắng thu thập dữ liệu từ nó.
Không giống như hầu hết các cảm biến chuyển động và cảm biến vị trí trả về một mảng cảm biến đa chiều
giá trị cho mỗi SensorEvent
, các cảm biến môi trường sẽ trả về một cảm biến duy nhất
cho từng sự kiện dữ liệu. Ví dụ: nhiệt độ tính bằng °C hoặc áp suất tính bằng hPa.
Ngoài ra, không giống như cảm biến chuyển động và cảm biến vị trí, thường yêu cầu độ phân giải cao hoặc truyền thấp
thì cảm biến môi trường thường không yêu cầu lọc dữ liệu hoặc xử lý dữ liệu nào. Bàn
1 cung cấp thông tin tóm tắt về các cảm biến môi trường được hỗ trợ trên nền tảng Android.
Bảng 1. Cảm biến môi trường được hỗ trợ trên nền tảng Android.
Cảm biến | Dữ liệu sự kiện của cảm biến | Đơn vị đo | Mô tả dữ liệu |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
°C | Nhiệt độ không khí xung quanh. |
TYPE_LIGHT |
event.values[0] |
lx | Độ chiếu sáng. |
TYPE_PRESSURE |
event.values[0] |
hPa hoặc mbar | Áp suất không khí xung quanh. |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | Độ ẩm tương đối xung quanh. |
TYPE_TEMPERATURE |
event.values[0] |
°C | Nhiệt độ của thiết bị.1 |
1 Cách triển khai sẽ khác nhau tuỳ theo thiết bị thiết bị. Cảm biến này không còn được dùng trong Android 4.0 (API cấp 14).
Sử dụng cảm biến ánh sáng, áp suất và nhiệt độ
Dữ liệu thô bạn thu được từ cảm biến ánh sáng, cảm biến áp suất và nhiệt độ thường không yêu cầu
hiệu chuẩn, lọc hoặc sửa đổi, khiến chúng trở thành một trong những cảm biến dễ sử dụng nhất. Người nhận
thu thập dữ liệu qua những cảm biến này, trước tiên, bạn sẽ tạo một thực thể của lớp SensorManager
. Bạn có thể dùng thực thể này để lấy thực thể của cảm biến vật lý.
Sau đó, bạn đăng ký trình nghe cảm biến trong phương thức onResume()
và bắt đầu xử lý dữ liệu cảm biến nhận được trong phương thức gọi lại onSensorChanged()
. Chiến lược phát hành đĩa đơn
đoạn mã sau đây hướng dẫn bạn cách làm việc này:
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var pressure: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val millibarsOfPressure = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL) } override fun onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause() sensorManager.unregisterListener(this) } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor pressure; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float millibarsOfPressure = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
Bạn phải luôn triển khai cả hai phương thức gọi lại onAccuracyChanged()
và onSensorChanged()
. Ngoài ra, hãy
đảm bảo rằng bạn luôn huỷ đăng ký một cảm biến khi một hoạt động tạm dừng. Việc này sẽ ngăn cảm biến
liên tục cảm biến dữ liệu và làm tiêu hao pin.
Sử dụng cảm biến độ ẩm
Bạn có thể thu được dữ liệu độ ẩm tương đối thô bằng cách sử dụng cảm biến độ ẩm giống như cách bạn sử dụng
cảm biến ánh sáng, áp suất và nhiệt độ. Tuy nhiên, nếu thiết bị có cả cảm biến độ ẩm
(TYPE_RELATIVE_HUMIDITY
) và một cảm biến nhiệt độ (TYPE_AMBIENT_TEMPERATURE
) mà bạn có thể dùng 2 luồng dữ liệu này để tính toán
điểm sương và độ ẩm tuyệt đối.
Điểm sương
Điểm sương là nhiệt độ mà tại đó một thể tích không khí cho trước phải được làm mát ở mức không đổi áp suất khí quyển, để hơi nước ngưng tụ thành nước. Phương trình sau đây cho biết cách bạn có thể tính điểm sương:
![t_d(t,RH) = Tn · (ln(RH/100) + m·t/(T_n+t)
))/(m - [ln(RH/100%) + m·t/(T_n+t)])](https://developer.android.com/static/images/guide/topics/sensors/dew_point.png?authuser=19&hl=vi)
Ở đâu,
- td = nhiệt độ điểm sương tính bằng độ C
- t = nhiệt độ thực tế tính bằng độ C
- RH = độ ẩm tương đối thực tế tính bằng phần trăm (%)
- m = 17,62
- Tn = 243,12
Độ ẩm tuyệt đối
Độ ẩm tuyệt đối là khối lượng hơi nước trong một thể tích không khí khô cho trước. Tuyệt đối độ ẩm được đo bằng gam/mét3. Phương trình sau đây cho biết cách bạn có thể tính độ ẩm tuyệt đối:
![d_v(t,RH) = (RH/100) · A · exp(m·
t/(T_n+t)/(273,15 + t)](https://developer.android.com/static/images/guide/topics/sensors/absolute_humidity.png?authuser=19&hl=vi)
Ở đâu,
- dv = độ ẩm tuyệt đối tính bằng gam/mét3
- t = nhiệt độ thực tế tính bằng độ C
- RH = độ ẩm tương đối thực tế tính bằng phần trăm (%)
- m = 17,62
- Tn = 243,12 độ C
- A = 6.112 hPa