Sensors API: nó là gì, các loại cảm biến và làm việc với cảm biến

Tác giả: IT Sectr Đã đăng: 2026-03-26 Thời gian đọc: 10 phút

Sensors API là giao diện nền tảng Android để truy cập các cảm biến phần cứng của thiết bị. API cung cấp một cách thống nhất để lấy dữ liệu từ gia tốc kế, con quay hồi chuyển, từ kế, cảm biến ánh sáng và các cảm biến khác. Theo Google, 2026, hơn 95% thiết bị Android hiện đại được trang bị ít nhất ba loại cảm biến, mở ra cơ hội rộng lớn để phát triển các ứng dụng nhận biết ngữ cảnh.

Những điểm chính

  • Sensors API — giao diện Android thống nhất để làm việc với cảm biến phần cứng của thiết bị.
  • Ba danh mục — cảm biến Motion, Position và Environment với các nguyên lý đo lường khác nhau.
  • SensorManager — dịch vụ hệ thống để lấy danh sách cảm biến và đăng ký trình lắng nghe.
  • Tốc độ cập nhật được thiết lập qua các hằng số SENSOR_DELAY từ NORMAL đến FASTEST.
  • Cảm biến ảo — Gravity, Rotation Vector và Linear Acceleration dựa trên sự kết hợp của các cảm biến vật lý.

Sensors API trong Android là gì?

Sensors API là giao diện phần mềm của Android Framework cung cấp cho nhà phát triển quyền truy cập vào các cảm biến phần cứng của thiết bị di động. API là một phần của Android SDK từ phiên bản 1.0 và có sẵn qua gói android.hardware. Giao diện này trừu tượng hóa sự khác biệt giữa các triển khai cảm biến từ các nhà sản xuất khác nhau — Qualcomm, MediaTek, Samsung Exynos — và cung cấp một mô hình thống nhất để làm việc với cảm biến.

Các tính năng chính của Sensors API

API cho phép ba thao tác chính: lấy danh sách các cảm biến có sẵn, đăng ký trình lắng nghe để nhận dữ liệu và quản lý tốc độ cập nhật. SensorManager đóng vai trò là điểm truy cập trung tâm cho tất cả các thao tác. Hệ thống thông báo cho ứng dụng qua callback onSensorChanged, truyền một đối tượng SensorEvent với một mảng các giá trị float.

Sự phát triển của Sensors API

Trong suốt quá trình tồn tại của Android, API đã trải qua nhiều giai đoạn phát triển. Phiên bản 2.3 (Gingerbread) đã giới thiệu hỗ trợ xử lý hàng loạt — nhóm các sự kiện cảm biến để giảm mức tiêu thụ điện năng. Android 4.0 (Ice Cream Sandwich) đã thêm các cảm biến ảo Gravity và Linear Acceleration. Bắt đầu từ Android 8.0, hệ thống đã hạn chế quyền truy cập nền vào cảm biến để tăng cường quyền riêng tư.

kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensorList: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
sensorList.forEach { sensor ->
    Log.d("Cảm biến", "${sensor.name} — ${sensor.type}")
}

Giới hạn và yêu cầu

Không phải tất cả thiết bị đều có cùng một bộ cảm biến. Ứng dụng phải kiểm tra tính khả dụng của một cảm biến cụ thể trước khi đăng ký trình lắng nghe. Trình giả lập Android chỉ hỗ trợ một bộ cảm biến hạn chế — gia tốc kế và từ kế. Kiểm tra các cảm biến khác yêu cầu thiết bị vật lý. Bắt đầu từ Android 12, các ứng dụng phải khai báo việc sử dụng cảm biến trong tệp kê khai.

Các loại cảm biến Android: Motion, Position, Environment

Android phân loại tất cả cảm biến thành ba danh mục: Motion, Position và Environment. Cảm biến Motion bao gồm gia tốc kế, con quay hồi chuyển và máy đếm bước. Cảm biến Position bao gồm từ kế và hướng. Cảm biến Environment bao gồm ánh sáng, áp suất, nhiệt độ và độ ẩm.

Danh mụcCảm biếnLoại (hằng số)Vật lý/Ảo
MotionGia tốc kếTYPE_ACCELEROMETERVật lý
MotionCon quay hồi chuyểnTYPE_GYROSCOPEVật lý
MotionMáy đếm bướcTYPE_STEP_COUNTERVật lý
MotionGravityTYPE_GRAVITYẢo
PositionTừ kếTYPE_MAGNETIC_FIELDVật lý
PositionRotation VectorTYPE_ROTATION_VECTORẢo
EnvironmentÁnh sángTYPE_LIGHTVật lý
EnvironmentÁp suấtTYPE_PRESSUREVật lý

Cảm biến Motion: gia tốc kế và con quay hồi chuyển

Gia tốc kế đo gia tốc tính bằng m/s² dọc theo ba trục — X, Y và Z. Các giá trị bao gồm trọng lực (9,8 m/s² dọc theo trục Z khi đứng yên). Con quay hồi chuyển đo vận tốc góc tính bằng rad/s — tốc độ quay của thiết bị quanh mỗi trục. Sự kết hợp của hai cảm biến này được sử dụng trong điều hướng, trò chơi và ứng dụng AR.

kotlin
class SensorActivity : Activity(), SensorEventListener {
    override fun onSensorChanged(event: SensorEvent) {
        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
            val x = event.values[0]
            val y = event.values[1]
            val z = event.values[2]
            textView.text = "X: $x, Y: $y, Z: $z"
        }
    }
    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}

Cảm biến Position: từ kế và hướng

Từ kế (TYPE_MAGNETIC_FIELD) đo từ trường tính bằng microtesla (µT) dọc theo ba trục. Nó được sử dụng như la bàn kỹ thuật số — kết hợp với gia tốc kế, nó xác định phương vị của thiết bị. Rotation Vector là một cảm biến ảo hợp nhất dữ liệu từ con quay hồi chuyển, gia tốc kế và từ kế để xác định hướng chính xác.

Cảm biến Environment: ánh sáng, áp suất, nhiệt độ

Cảm biến ánh sáng (TYPE_LIGHT) đo mức độ ánh sáng xung quanh tính bằng lux (lx). Nó được sử dụng để tự động điều chỉnh độ sáng màn hình. Cảm biến áp suất (TYPE_PRESSURE) đo áp suất khí quyển tính bằng hectopascal (hPa) — được sử dụng trong các ứng dụng điều hướng để xác định độ cao so với mực nước biển.

Kiến trúc Sensors API hoạt động như thế nào

Sensors API được xây dựng trên kiến trúc máy khách-máy chủ. Ứng dụng đóng vai trò là máy khách và SensorManager đóng vai trò là dịch vụ hệ thống Android. Khi ứng dụng đăng ký một trình lắng nghe qua registerListener, SensorManager giao tiếp với HAL (Lớp trừu tượng hóa phần cứng) — một trình điều khiển cảm biến cấp thấp chạy ở cấp độ nhân Linux.

Vòng đời của sự kiện cảm biến

Trình điều khiển HAL nhận dữ liệu thô từ chip phần cứng, lọc nhiễu và truyền nó lên trên ngăn xếp — qua SensorService (tiến trình hệ thống) đến ứng dụng. Dữ liệu được truyền dưới dạng đối tượng SensorEvent chứa một mảng các giá trị float values và dấu thời gian tính bằng nano giây. Tốc độ sự kiện phụ thuộc vào chế độ phân phối được chọn.

Các chế độ phân phối sự kiện

Khi đăng ký trình lắng nghe, nhà phát triển chỉ định độ trễ mong muốn giữa các sự kiện bằng cách sử dụng các hằng số SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) và SENSOR_DELAY_FASTEST (0 ms — tốc độ tối đa). Tốc độ thực tế có thể khác — hệ thống tối ưu hóa mức tiêu thụ điện năng.

kotlin
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
    this,
    sensor,
    SensorManager.SENSOR_DELAY_GAME
)

Xử lý hàng loạt (Batch Processing)

Bắt đầu từ Android 2.3, các cảm biến hỗ trợ chế độ hàng loạt — các sự kiện được tích lũy trong bộ đệm FIFO và được phân phối trong một lô. Điều này cho phép bộ xử lý ở chế độ ngủ lâu hơn, giảm mức tiêu thụ điện năng lên đến 60%. Kích thước bộ đệm phụ thuộc vào chip cảm biến và được chỉ định trong trường Sensor.fifoMaxEventCount.

Sử dụng SensorManager để truy cập cảm biến

SensorManager là một dịch vụ hệ thống có sẵn qua getSystemService(Context.SENSOR_SERVICE). Nó cung cấp các phương thức để lấy danh sách cảm biến, lấy một cảm biến mặc định cụ thể và đăng ký/hủy đăng ký trình lắng nghe. SensorManager là một singleton — một phiên bản duy nhất cho toàn bộ ứng dụng.

Kiểm tra tính khả dụng của cảm biến

Trước khi sử dụng cảm biến, bạn phải kiểm tra tính khả dụng của nó. Phương thức getDefaultSensor(type) trả về null nếu cảm biến không có trên thiết bị. Nhận được null mà không kiểm tra sẽ dẫn đến NullPointerException khi đăng ký trình lắng nghe. Phương thức getSensorList(type) trả về danh sách tất cả cảm biến.

kotlin
fun checkSensorAvailability(type: Int): Boolean {
    val sensorManager =
        getSystemService(Context.SENSOR_SERVICE) as SensorManager
    return sensorManager.getDefaultSensor(type) != null
}

// Sử dụng:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
    Log.d("Cảm biến", "Con quay hồi chuyển có sẵn")
}

Đăng ký và hủy đăng ký trình lắng nghe

Trình lắng nghe được đăng ký qua registerListener(listener, sensor, delay). Quan trọng: bạn phải hủy đăng ký trình lắng nghe trong phương thức onPause() qua unregisterListener(listener). Nếu không, ứng dụng sẽ tiếp tục nhận các sự kiện cảm biến, làm hao pin ngay cả ở chế độ nền. Android 8+ hiển thị cảnh báo trong logcat về các trình lắng nghe chưa được hủy đăng ký.

Xử lý thay đổi độ chính xác

Phương thức onAccuracyChanged(sensor, accuracy) được gọi khi độ chính xác của cảm biến thay đổi. Giá trị: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW và UNRELIABLE. Khi nhận được UNRELIABLE, dữ liệu cảm biến nên được bỏ qua cho đến khi độ chính xác được khôi phục. Ví dụ, từ kế yêu cầu hiệu chuẩn — lắc thiết bị theo hình số tám.

Ví dụ mã để làm việc với cảm biến trong Kotlin

Hãy xem các ví dụ thực tế về việc sử dụng Sensors API trong các ứng dụng Android với Kotlin. Ví dụ đầu tiên — xác định hướng màn hình bằng gia tốc kế. Ví dụ thứ hai — đọc dữ liệu từ kế với hiệu chuẩn. Ví dụ thứ ba — máy dò bước bằng máy đếm bước.

Xác định hướng của thiết bị

Sự kết hợp của gia tốc kế và từ kế được sử dụng để xác định hướng. Phương thức SensorManager.getRotationMatrix() tính toán ma trận xoay và getOrientation() trích xuất các góc pitch, roll và azimuth. Azimuth (phương vị) — góc so với bắc từ tính tính bằng radian.

kotlin
val gravity = FloatArray(3)
val geomagnetic = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientation = FloatArray(3)

SensorManager.getRotationMatrix(
    rotationMatrix, null, gravity, geomagnetic
)
SensorManager.getOrientation(rotationMatrix, orientation)
// orientation[0] — azimuth, [1] — pitch, [2] — roll
val azimuthDeg = Math.toDegrees(orientation[0].toDouble())

Máy dò bước với máy đếm bước

Máy đếm bước (TYPE_STEP_COUNTER) trả về tổng số bước mà người dùng đã thực hiện kể từ lần khởi động lại thiết bị gần nhất. Cảm biến hoạt động ở cấp độ phần cứng — nó hoạt động ngay cả khi ứng dụng không chạy. Để có được số bước mỗi phiên, bạn cần lưu giá trị ban đầu và tính toán sự khác biệt.

kotlin
var initialSteps = 0
var isInitialized = false

override fun onSensorChanged(event: SensorEvent) {
    if (event.sensor.type == Sensor.TYPE_STEP_COUNTER) {
        if (!isInitialized) {
            initialSteps = event.values[0].toInt()
            isInitialized = true
        }
        val currentSteps = event.values[0].toInt()
        val sessionSteps = currentSteps - initialSteps
        Log.d("Bước", "Số bước mỗi phiên: $sessionSteps")
    }
}

Độ sáng thích ứng sử dụng cảm biến ánh sáng

Cảm biến ánh sáng cho phép điều chỉnh giao diện theo điều kiện môi trường. Trong điều kiện ánh sáng yếu (dưới 10 lx), bạn có thể chuyển sang chế độ tối. Trong ánh sáng mặt trời chói chang (hơn 10000 lx), bạn có thể tăng độ tương phản. Giá trị trung bình động của 5 giá trị cuối cùng được sử dụng để lọc nhiễu.

Cảm biến ảo và thuật toán hợp nhất

Android cung cấp một số cảm biến ảo không có phần cứng tương đương trực tiếp. Một cảm biến ảo tính toán các chỉ số của nó dựa trên sự kết hợp của các cảm biến vật lý. Điều này giảm gánh nặng cho nhà phát triển — hệ thống tự thực hiện các thuật toán hợp nhất dữ liệu.

Gravity và Linear Acceleration

Cảm biến Gravity (TYPE_GRAVITY) trích xuất thành phần trọng lực từ các chỉ số của gia tốc kế bằng bộ lọc thông thấp. Linear Acceleration (TYPE_LINEAR_ACCELERATION), ngược lại, loại bỏ trọng lực và chỉ để lại gia tốc tuyến tính của thiết bị. Tổng của Gravity và Linear Acceleration cho các chỉ số thô của gia tốc kế.

Rotation Vector

Rotation Vector — cảm biến ảo phức tạp nhất. Nó kết hợp dữ liệu từ con quay hồi chuyển (các thay đổi tần số cao), gia tốc kế (vectơ trọng lực) và từ kế (hướng so với bắc). Kết quả là một quaternion mô tả hướng tuyệt đối của thiết bị trong không gian. Nó được sử dụng trong các ứng dụng AR và tai nghe VR.

Game Rotation Vector

Game Rotation Vector — một phiên bản đơn giản hóa của Rotation Vector mà không sử dụng từ kế. Điều này cho độ chính xác phương vị thấp hơn nhưng tốc độ cập nhật và độ ổn định cao hơn. Được khuyến nghị cho các trò chơi mà độ trễ thấp quan trọng hơn hướng tuyệt đối so với bắc.

Tối ưu hóa pin khi làm việc với cảm biến

Cảm biến là một trong những thành phần tiêu tốn nhiều năng lượng nhất của thiết bị. Gia tốc kế và con quay hồi chuyển ở tốc độ thăm dò tối đa có thể làm hao pin trong 3–4 giờ hoạt động liên tục. Tối ưu hóa việc sử dụng cảm biến là một nhiệm vụ quan trọng đối với bất kỳ ứng dụng nào sử dụng Sensors API.

Chọn độ trễ tối ưu

Không sử dụng SENSOR_DELAY_FASTEST một cách không cần thiết. Đối với hoạt ảnh UI, SENSOR_DELAY_UI (60 ms) là đủ. Đối với phát hiện hướng màn hình — SENSOR_DELAY_NORMAL (200 ms). Tốc độ càng cao, bộ xử lý càng dành nhiều thời gian ở trạng thái hoạt động. Sự khác biệt giữa NORMAL và FASTEST lên đến 10 lần về mức tiêu thụ điện năng.

Hủy đăng ký trình lắng nghe ở chế độ nền

Bắt đầu từ Android 8.0 (API 26), các ứng dụng nền nhận được sự kiện cảm biến với tốc độ giảm. Trong Android 12+, quyền truy cập nền vào cảm biến Motion và Position yêu cầu quyền BODY_SENSORS_BACKGROUND. Hủy đăng ký trình lắng nghe khi ứng dụng chuyển sang chế độ nền — điều này kéo dài tuổi thọ pin của thiết bị.

Xử lý hàng loạt và bộ đệm FIFO

Sử dụng xử lý hàng loạt qua phương thức registerListener(listener, sensor, delay, maxReportLatencyUs). Tham số maxReportLatencyUs đặt độ trễ phân phối sự kiện tối đa tính bằng micro giây. Với giá trị 1000000 (1 giây), các sự kiện tích lũy trong bộ đệm FIFO của cảm biến và được phân phối mỗi giây một lần — bộ xử lý thức dậy ít thường xuyên hơn.

Câu hỏi thường gặp

Những cảm biến nào có trên tất cả các thiết bị Android?

Bộ tối thiểu là một gia tốc kế và từ kế. Hai cảm biến này có mặt trên hơn 95% thiết bị. Con quay hồi chuyển, cảm biến ánh sáng và cảm biến khoảng cách — trên 70–80% các mẫu hiện đại. Các cảm biến khác (áp suất, nhiệt độ, độ ẩm, máy đếm bước) ít phổ biến hơn và phụ thuộc vào phân khúc giá của thiết bị.

Sự khác biệt giữa TYPE_ACCELEROMETER và TYPE_LINEAR_ACCELERATION là gì?

TYPE_ACCELEROMETER trả về tổng gia tốc bao gồm trọng lực (9,8 m/s²). TYPE_LINEAR_ACCELERATION trả về gia tốc không bao gồm trọng lực — chỉ gia tốc chuyển động của thiết bị. Nếu thiết bị nằm yên, gia tốc kế sẽ hiển thị 9,8 m/s² dọc theo trục Z, trong khi Linear Acceleration sẽ hiển thị 0 trên tất cả các trục.

Làm thế nào để kiểm tra xem cảm biến cần thiết có trên thiết bị không?

Sử dụng getPackageManager().hasSystemFeature() với các hằng số thích hợp: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY và các hằng số khác. Một cách khác là gọi getDefaultSensor(type) và kiểm tra kết quả là null. Cách đầu tiên tốt hơn để kiểm tra trong quá trình khởi tạo.

Tại sao giá trị cảm biến dao động và làm thế nào để làm mịn chúng?

Dữ liệu thô từ cảm biến chứa nhiễu. Để làm mịn, hãy sử dụng bộ lọc thông thấp: newValue = alpha * rawValue + (1 — alpha) * previousValue. Hệ số alpha 0,1–0,3 cung cấp sự cân bằng tốt giữa khả năng phản hồi và độ mượt. Đối với con quay hồi chuyển, bộ lọc thông cao cũng được áp dụng để loại bỏ độ trôi zero.

Có thể sử dụng cảm biến ở chế độ nền không?

Có, nhưng có giới hạn. Bắt đầu từ Android 8.0, tốc độ sự kiện cảm biến giảm đối với các ứng dụng nền. Bắt đầu từ Android 12, cần có quyền BODY_SENSORS_BACKGROUND để truy cập cảm biến ở chế độ nền. Đối với công việc nền, nên sử dụng Foreground Service với thông báo.

Tóm tắt

  • Sensors API — giao diện Android thống nhất để lấy dữ liệu từ cảm biến phần cứng của thiết bị qua SensorManager.
  • Ba danh mục — Motion (gia tốc kế, con quay hồi chuyển), Position (từ kế) và Environment (ánh sáng, áp suất) với các nguyên lý hoạt động và ứng dụng khác nhau.
  • Cảm biến ảo — Gravity, Linear Acceleration và Rotation Vector dựa trên sự hợp nhất dữ liệu từ các cảm biến vật lý và không có phần cứng tương đương.
  • Tối ưu hóa — chọn độ trễ chính xác (SENSOR_DELAY_NORMAL, UI, GAME, FASTEST) và sử dụng xử lý hàng loạt giảm mức tiêu thụ điện năng lên đến 60%.
  • Giới hạn — Android 8+ giảm tốc độ cảm biến ở chế độ nền, Android 12+ yêu cầu BODY_SENSORS_BACKGROUND để truy cập nền.
  • Kiểm tra cơ bản — trước khi đăng ký trình lắng nghe, hãy kiểm tra tính khả dụng của cảm biến qua getDefaultSensor hoặc hasSystemFeature.
  • Sử dụng bộ lọc thông thấp để làm mịn nhiễu và hủy đăng ký trình lắng nghe khi chuyển sang nền để tiết kiệm pin.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm