Cảm biến môi trường
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
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.
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:
Ở đâ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:
Ở đâ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
Bạn cũng nên đọc
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-26 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-26 UTC."],[],[],null,["# Environment sensors\n\nThe Android platform provides four sensors that let you monitor various environmental properties.\nYou can use these sensors to monitor relative ambient humidity, illuminance, ambient pressure, and\nambient temperature near an Android-powered device. All four environment sensors are hardware-based\nand are available only if a device manufacturer has built them into a device. With the exception of\nthe light sensor, which most device manufacturers use to control screen brightness, environment\nsensors are not always available on devices. Because of this, it's particularly important that you\nverify at runtime whether an environment sensor exists before you attempt to acquire data from\nit.\n\nUnlike most motion sensors and position sensors, which return a multi-dimensional array of sensor\nvalues for each [SensorEvent](/reference/android/hardware/SensorEvent), environment sensors return a single sensor\nvalue for each data event. For example, the temperature in °C or the pressure in hPa.\nAlso, unlike motion sensors and position sensors, which often require high-pass or low-pass\nfiltering, environment sensors do not typically require any data filtering or data processing. Table\n1 provides a summary of the environment sensors that are supported on the Android platform.\n\n\n**Table 1.** Environment sensors that are supported on the Android platform.\n\n| Sensor | Sensor event data | Units of measure | Data description |\n|-----------------------------------------------------------------------------------------|-------------------|------------------|----------------------------|\n| [TYPE_AMBIENT_TEMPERATURE](/reference/android/hardware/Sensor#TYPE_AMBIENT_TEMPERATURE) | `event.values[0]` | °C | Ambient air temperature. |\n| [TYPE_LIGHT](/reference/android/hardware/Sensor#TYPE_LIGHT) | `event.values[0]` | lx | Illuminance. |\n| [TYPE_PRESSURE](/reference/android/hardware/Sensor#TYPE_PRESSURE) | `event.values[0]` | hPa or mbar | Ambient air pressure. |\n| [TYPE_RELATIVE_HUMIDITY](/reference/android/hardware/Sensor#TYPE_RELATIVE_HUMIDITY) | `event.values[0]` | % | Ambient relative humidity. |\n| [TYPE_TEMPERATURE](/reference/android/hardware/Sensor#TYPE_TEMPERATURE) | `event.values[0]` | °C | Device temperature.^1^ |\n\n^**1**^ Implementations vary from device to\ndevice. This sensor was deprecated in Android 4.0 (API Level 14).\n\nUse the light, pressure, and temperature sensors\n------------------------------------------------\n\nThe raw data you acquire from the light, pressure, and temperature sensors usually requires no\ncalibration, filtering, or modification, which makes them some of the easiest sensors to use. To\nacquire data from these sensors you first create an instance of the [SensorManager](/reference/android/hardware/SensorManager) class, which you can use to get an instance of a physical sensor.\nThen you register a sensor listener in the [onResume()](/reference/android/app/Activity#onResume()) method, and start handling incoming sensor data in the [onSensorChanged()](/reference/android/hardware/SensorEventListener#onSensorChanged(android.hardware.SensorEvent)) callback method. The\nfollowing code shows you how to do this: \n\n### Kotlin\n\n```kotlin\nclass SensorActivity : Activity(), SensorEventListener {\n\n private lateinit var sensorManager: SensorManager\n private var pressure: Sensor? = null\n\n public override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.main)\n\n // Get an instance of the sensor service, and use that to get an instance of\n // a particular sensor.\n sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager\n pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)\n }\n\n override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {\n // Do something here if sensor accuracy changes.\n }\n\n override fun onSensorChanged(event: SensorEvent) {\n val millibarsOfPressure = event.values[0]\n // Do something with this sensor data.\n }\n\n override fun onResume() {\n // Register a listener for the sensor.\n super.onResume()\n sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL)\n }\n\n override fun onPause() {\n // Be sure to unregister the sensor when the activity pauses.\n super.onPause()\n sensorManager.unregisterListener(this)\n }\n}\n```\n\n### Java\n\n```java\npublic class SensorActivity extends Activity implements SensorEventListener {\n private SensorManager sensorManager;\n private Sensor pressure;\n\n @Override\n public final void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.main);\n\n // Get an instance of the sensor service, and use that to get an instance of\n // a particular sensor.\n sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);\n pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);\n }\n\n @Override\n public final void onAccuracyChanged(Sensor sensor, int accuracy) {\n // Do something here if sensor accuracy changes.\n }\n\n @Override\n public final void onSensorChanged(SensorEvent event) {\n float millibarsOfPressure = event.values[0];\n // Do something with this sensor data.\n }\n\n @Override\n protected void onResume() {\n // Register a listener for the sensor.\n super.onResume();\n sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL);\n }\n\n @Override\n protected void onPause() {\n // Be sure to unregister the sensor when the activity pauses.\n super.onPause();\n sensorManager.unregisterListener(this);\n }\n}\n```\n\nYou must always include implementations of both the [onAccuracyChanged()](/reference/android/hardware/SensorEventListener#onAccuracyChanged(android.hardware.Sensor, int)) and [onSensorChanged()](/reference/android/hardware/SensorEventListener#onSensorChanged(android.hardware.SensorEvent)) callback methods. Also, be\nsure that you always unregister a sensor when an activity pauses. This prevents a sensor from\ncontinually sensing data and draining the battery.\n\nUse the humidity sensor\n-----------------------\n\nYou can acquire raw relative humidity data by using the humidity sensor the same way that you use\nthe light, pressure, and temperature sensors. However, if a device has both a humidity sensor\n([TYPE_RELATIVE_HUMIDITY](/reference/android/hardware/Sensor#TYPE_RELATIVE_HUMIDITY)) and a temperature sensor ([TYPE_AMBIENT_TEMPERATURE](/reference/android/hardware/Sensor#TYPE_AMBIENT_TEMPERATURE)) you can use these two data streams to calculate\nthe dew point and the absolute humidity.\n\n#### Dew point\n\nThe dew point is the temperature at which a given volume of air must be cooled, at constant\nbarometric pressure, for water vapor to condense into water. The following equation shows how you\ncan calculate the dew point:\n\nWhere,\n\n- t~d~ = dew point temperature in degrees C\n- t = actual temperature in degrees C\n- RH = actual relative humidity in percent (%)\n- m = 17.62\n- T~n~ = 243.12\n\n#### Absolute humidity\n\nThe absolute humidity is the mass of water vapor in a given volume of dry air. Absolute\nhumidity is measured in grams/meter^3^. The following equation shows how you\ncan calculate the absolute humidity:\n\nWhere,\n\n- d~v~ = absolute humidity in grams/meter^3^\n- t = actual temperature in degrees C\n- RH = actual relative humidity in percent (%)\n- m = 17.62\n- T~n~ = 243.12 degrees C\n- A = 6.112 hPa\n\n### You should also read\n\n- [Sensors](/guide/topics/sensors)\n- [Sensors Overview](/guide/topics/sensors/sensors_overview)\n- [Position Sensors](/guide/topics/sensors/sensors_position)\n- [Motion Sensors](/guide/topics/sensors/sensors_motion)"]]