Nền tảng Android cung cấp 2 cảm biến giúp bạn xác định vị trí của thiết bị: cảm biến từ trường và cảm biến gia tốc. Nền tảng Android cũng cung cấp một cảm biến cho phép bạn xác định khoảng cách giữa mặt trước của thiết bị với một vật thể (còn gọi là cảm biến tiệm cận). Cảm biến từ trường địa từ và cảm biến tiệm cận dựa trên phần cứng. Hầu hết các nhà sản xuất điện thoại và máy tính bảng đều trang bị cảm biến từ trường địa từ. Tương tự, các nhà sản xuất thiết bị cầm tay thường trang bị cảm biến độ gần để xác định thời điểm thiết bị cầm tay được đặt gần mặt người dùng (ví dụ: trong khi gọi điện thoại). Để xác định hướng của thiết bị, bạn có thể sử dụng kết quả đọc của gia tốc kế và cảm biến từ trường trên thiết bị.
Lưu ý: Cảm biến hướng đã ngừng hoạt động trong Android 2.2 (API cấp 8) và loại cảm biến hướng đã ngừng hoạt động trong Android 4.4W (API cấp 20).
Cảm biến vị trí rất hữu ích trong việc xác định vị trí thực của thiết bị trong khung tham chiếu của thế giới. Ví dụ: bạn có thể sử dụng cảm biến từ trường kết hợp với gia tốc kế để xác định vị trí của thiết bị so với cực từ bắc. Bạn cũng có thể dùng các cảm biến này để xác định hướng của thiết bị trong khung tham chiếu của ứng dụng. Cảm biến vị trí thường không được dùng để theo dõi chuyển động của thiết bị, chẳng hạn như rung, nghiêng hoặc đẩy (để biết thêm thông tin, hãy xem phần Cảm biến chuyển động).
Cảm biến từ trường địa từ và gia tốc kế trả về mảng đa chiều gồm các giá trị cảm biến cho mỗi SensorEvent
. Ví dụ: cảm biến từ trường địa từ cung cấp các giá trị cường độ từ trường địa từ cho từng trục trong số 3 trục toạ độ trong một sự kiện cảm biến duy nhất. Tương tự, cảm biến gia tốc kế đo gia tốc được áp dụng cho thiết bị trong sự kiện cảm biến. Để biết thêm thông tin về các hệ toạ độ mà cảm biến sử dụng, hãy xem phần
Hệ toạ độ của cảm biến. Cảm biến tiệm cận cung cấp một giá trị duy nhất cho mỗi sự kiện cảm biến. Bảng 1 tóm tắt các cảm biến vị trí được hỗ trợ trên nền tảng Android.
Bảng 1. Các cảm biến vị trí được hỗ trợ trên nền tảng Android.
Cảm biến | Dữ liệu sự kiện cảm biến | Mô tả | Đơn vị đo lường |
---|---|---|---|
TYPE_GAME_ROTATION_VECTOR |
SensorEvent.values[0] |
Thành phần vectơ xoay dọc theo trục x (x * sin(θ/2)). | Không có đơn vị |
SensorEvent.values[1] |
Thành phần vectơ xoay dọc theo trục y (y * sin(θ/2)). | ||
SensorEvent.values[2] |
Thành phần vectơ xoay dọc theo trục z (z * sin(θ/2)). | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR |
SensorEvent.values[0] |
Thành phần vectơ xoay dọc theo trục x (x * sin(θ/2)). | Không có đơn vị |
SensorEvent.values[1] |
Thành phần vectơ xoay dọc theo trục y (y * sin(θ/2)). | ||
SensorEvent.values[2] |
Thành phần vectơ xoay dọc theo trục z (z * sin(θ/2)). | ||
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
Cường độ từ trường địa từ dọc theo trục x. | μT |
SensorEvent.values[1] |
Cường độ từ trường địa từ dọc theo trục y. | ||
SensorEvent.values[2] |
Cường độ từ trường địa từ dọc theo trục z. | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
Cường độ từ trường địa từ (không hiệu chuẩn sắt từ) dọc theo trục x. | μT |
SensorEvent.values[1] |
Cường độ từ trường địa từ (không hiệu chuẩn sắt từ) dọc theo trục y. | ||
SensorEvent.values[2] |
Cường độ từ trường địa từ (không hiệu chuẩn sắt từ) dọc theo trục z. | ||
SensorEvent.values[3] |
Ước tính độ lệch của sắt dọc theo trục x. | ||
SensorEvent.values[4] |
Ước tính độ lệch do sắt dọc theo trục y. | ||
SensorEvent.values[5] |
Ước tính độ lệch sắt dọc theo trục z. | ||
TYPE_ORIENTATION 1 |
SensorEvent.values[0] |
Phương vị (góc quanh trục z). | Độ |
SensorEvent.values[1] |
Độ nghiêng (góc quanh trục x). | ||
SensorEvent.values[2] |
Lật (góc xung quanh trục y). | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
Khoảng cách từ vật thể.2 | cm |
1Cảm biến này không còn được dùng trong Android 2.2 (API cấp 8) và loại cảm biến này không còn được dùng trong Android 4.4W (API cấp 20). Khung cảm biến cung cấp các phương thức thay thế để thu thập hướng của thiết bị, được thảo luận trong phần Tính toán hướng của thiết bị.
2 Một số cảm biến độ gần chỉ cung cấp các giá trị nhị phân biểu thị gần và xa.
Dùng cảm biến vectơ xoay trò chơi
Cảm biến vectơ xoay của trò chơi giống với Cảm biến vectơ xoay, ngoại trừ việc cảm biến này không sử dụng từ trường. Do đó, trục Y không hướng về phía bắc mà hướng về một điểm tham chiếu khác. Tham chiếu đó được phép trôi theo cùng thứ tự cường độ khi con quay hồi chuyển trôi xung quanh trục Z.
Vì cảm biến vectơ xoay trò chơi không sử dụng từ trường, nên các phép xoay tương đối sẽ chính xác hơn và không bị ảnh hưởng bởi những thay đổi về từ trường. Sử dụng cảm biến này trong trò chơi nếu bạn không quan tâm đến hướng bắc và vectơ xoay thông thường không phù hợp với nhu cầu của bạn do phụ thuộc vào từ trường.
Đoạn mã sau đây cho biết cách lấy một thực thể của cảm biến vectơ xoay trò chơi mặc định:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
Sử dụng cảm biến vectơ xoay từ trường trái đất
Cảm biến vectơ xoay từ trường tương tự như cảm biến vectơ xoay, nhưng không sử dụng con quay hồi chuyển. Độ chính xác của cảm biến này thấp hơn cảm biến vectơ xoay thông thường, nhưng mức tiêu thụ điện năng sẽ giảm. Chỉ sử dụng cảm biến này nếu bạn muốn thu thập thông tin xoay ở chế độ nền mà không tiêu tốn quá nhiều pin. Cảm biến này hữu ích nhất khi được dùng kết hợp với tính năng phân lô.
Đoạn mã sau đây cho biết cách lấy một thực thể của cảm biến vectơ xoay từ trường địa từ mặc định:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
Tính toán hướng của thiết bị
Bằng cách tính toán hướng của thiết bị, bạn có thể theo dõi vị trí của thiết bị so với hệ quy chiếu của trái đất (cụ thể là cực từ bắc). Đoạn mã sau đây cho biết cách tính toán hướng của thiết bị:
Kotlin
private lateinit var sensorManager: SensorManager ... // Rotation matrix based on current readings from accelerometer and magnetometer. val rotationMatrix = FloatArray(9) SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading) // Express the updated rotation matrix as three orientation angles. val orientationAngles = FloatArray(3) SensorManager.getOrientation(rotationMatrix, orientationAngles)
Java
private SensorManager sensorManager; ... // Rotation matrix based on current readings from accelerometer and magnetometer. final float[] rotationMatrix = new float[9]; SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // Express the updated rotation matrix as three orientation angles. final float[] orientationAngles = new float[3]; SensorManager.getOrientation(rotationMatrix, orientationAngles);
Hệ thống tính toán các góc hướng bằng cách sử dụng cảm biến từ trường của thiết bị kết hợp với gia tốc kế của thiết bị. Khi dùng 2 cảm biến phần cứng này, hệ thống sẽ cung cấp dữ liệu cho 3 góc hướng sau:
- Phương vị (độ xoay quanh trục -z). Đây là góc giữa hướng la bàn hiện tại của thiết bị và hướng bắc từ trường. Nếu cạnh trên của thiết bị hướng về phía bắc từ, thì phương vị là 0 độ; nếu cạnh trên hướng về phía nam, thì phương vị là 180 độ. Tương tự, nếu cạnh trên hướng về phía đông, thì phương vị là 90 độ, và nếu cạnh trên hướng về phía tây, thì phương vị là 270 độ.
- Độ nghiêng (độ xoay quanh trục x). Đây là góc giữa một mặt phẳng song song với màn hình của thiết bị và một mặt phẳng song song với mặt đất. Nếu bạn giữ thiết bị song song với mặt đất, cạnh dưới gần bạn nhất và nghiêng cạnh trên của thiết bị về phía mặt đất, thì góc nghiêng sẽ dương. Nghiêng theo hướng ngược lại – di chuyển cạnh trên của thiết bị ra xa mặt đất – khiến góc nghiêng trở thành góc âm. Phạm vi giá trị là từ -90 độ đến 90 độ.
- Lật (độ xoay quanh trục y). Đây là góc giữa một mặt phẳng vuông góc với màn hình của thiết bị và một mặt phẳng vuông góc với mặt đất. Nếu bạn giữ thiết bị song song với mặt đất, với cạnh dưới gần bạn nhất và nghiêng cạnh trái của thiết bị về phía mặt đất, thì góc xoay sẽ dương. Nghiêng theo hướng ngược lại – di chuyển cạnh phải của thiết bị xuống đất – khiến góc nghiêng trở thành góc âm. Phạm vi giá trị là từ -180 độ đến 180 độ.
Lưu ý: Định nghĩa về độ nghiêng của cảm biến đã thay đổi để phản ánh phần lớn các hoạt động triển khai trong hệ sinh thái cảm biến địa lý.
Xin lưu ý rằng các góc này hoạt động dựa trên một hệ toạ độ khác với hệ toạ độ được dùng trong ngành hàng không (đối với góc xoay ngang, góc xoay dọc và góc xoay tròn). Trong hệ thống hàng không, trục x nằm dọc theo cạnh dài của máy bay, từ đuôi đến mũi.
Cảm biến hướng lấy dữ liệu bằng cách xử lý dữ liệu cảm biến thô từ cảm biến gia tốc và cảm biến từ trường. Do quá trình xử lý nặng liên quan, độ chính xác và độ chính xác của cảm biến hướng sẽ giảm. Cụ thể, cảm biến này chỉ đáng tin cậy khi góc xoay là 0. Do đó, cảm biến hướng đã ngừng hoạt động trong Android 2.2 (API cấp 8) và loại cảm biến hướng đã ngừng hoạt động trong Android 4.4W (API cấp 20).
Thay vì sử dụng dữ liệu thô từ cảm biến hướng, bạn nên sử dụng phương thức getRotationMatrix()
kết hợp với phương thức getOrientation()
để tính toán các giá trị hướng, như minh hoạ trong mẫu mã sau đây. Trong quy trình này, bạn có thể sử dụng phương thức remapCoordinateSystem()
để dịch các giá trị hướng sang khung tham chiếu của ứng dụng.
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private val accelerometerReading = FloatArray(3) private val magnetometerReading = FloatArray(3) private val rotationMatrix = FloatArray(9) private val orientationAngles = FloatArray(3) public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } override fun onResume() { super.onResume() // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer -> sensorManager.registerListener( this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField -> sensorManager.registerListener( this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } } override fun onPause() { super.onPause() // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this) } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. override fun onSensorChanged(event: SensorEvent) { if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size) } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size) } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. fun updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix( rotationMatrix, null, accelerometerReading, magnetometerReading ) // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles) // "orientationAngles" now has up-to-date information. } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private final float[] accelerometerReading = new float[3]; private final float[] magnetometerReading = new float[3]; private final float[] rotationMatrix = new float[9]; private final float[] orientationAngles = new float[3]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } @Override protected void onResume() { super.onResume(); // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); if (magneticField != null) { sensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } } @Override protected void onPause() { super.onPause(); // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this); } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.length); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.length); } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. public void updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles); // "orientationAngles" now has up-to-date information. } }
Bạn thường không cần thực hiện bất kỳ quy trình xử lý hoặc lọc dữ liệu nào đối với các góc định hướng thô của thiết bị, ngoài việc dịch hệ toạ độ của cảm biến sang khung tham chiếu của ứng dụng.
Sử dụng cảm biến từ trường
Cảm biến từ trường địa từ giúp bạn theo dõi những thay đổi trong từ trường của Trái Đất. Đoạn mã sau đây cho biết cách lấy một thực thể của cảm biến từ trường địa từ mặc định:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Lưu ý: Nếu ứng dụng của bạn nhắm đến Android 12 (API cấp 31) trở lên, thì cảm biến này sẽ bị giới hạn tốc độ.
Cảm biến này cung cấp dữ liệu thô về cường độ trường (tính bằng μT) cho từng trục toạ độ trong số 3 trục.
Thông thường, bạn không cần sử dụng trực tiếp cảm biến này. Thay vào đó, bạn có thể sử dụng cảm biến vectơ xoay để xác định chuyển động xoay thô hoặc bạn có thể sử dụng cảm biến gia tốc và cảm biến từ trường kết hợp với phương thức getRotationMatrix()
để lấy ma trận xoay và ma trận độ nghiêng. Sau đó, bạn có thể sử dụng các ma trận này với các phương thức getOrientation()
và getInclination()
để lấy dữ liệu về phương vị và độ nghiêng địa từ.
Lưu ý: Khi kiểm thử ứng dụng, bạn có thể cải thiện độ chính xác của cảm biến bằng cách vẫy thiết bị theo hình số 8.
Sử dụng từ kế chưa được hiệu chỉnh
Từ kế chưa hiệu chỉnh tương tự như cảm biến từ trường, ngoại trừ việc không có chế độ hiệu chỉnh sắt từ được áp dụng cho từ trường. Chế độ hiệu chuẩn tại nhà máy và bù trừ nhiệt độ vẫn được áp dụng cho từ trường. Từ kế chưa hiệu chỉnh rất hữu ích để xử lý các ước tính không chính xác về từ tính cố định. Nhìn chung, geomagneticsensor_event.values[0]
sẽ gần với uncalibrated_magnetometer_event.values[0] -
uncalibrated_magnetometer_event.values[3]
. Tức là
calibrated_x ~= uncalibrated_x - bias_estimate_x
Lưu ý: Cảm biến chưa được hiệu chỉnh cung cấp nhiều kết quả thô hơn và có thể có một số sai lệch, nhưng các phép đo của cảm biến này có ít bước nhảy hơn do các điểm điều chỉnh được áp dụng thông qua quy trình hiệu chuẩn. Một số ứng dụng có thể ưu tiên những kết quả chưa được hiệu chỉnh này vì chúng mượt mà và đáng tin cậy hơn. Ví dụ: nếu một ứng dụng đang cố gắng thực hiện tính năng kết hợp cảm biến của riêng mình, thì việc đưa ra các chế độ hiệu chuẩn có thể làm sai lệch kết quả.
Ngoài từ trường, từ kế chưa được hiệu chỉnh cũng cung cấp độ lệch sắt từ ước tính theo từng trục. Đoạn mã sau đây cho biết cách lấy một thực thể của từ kế chưa hiệu chỉnh mặc định:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
Sử dụng cảm biến độ gần
Cảm biến tiệm cận giúp bạn xác định khoảng cách giữa một vật thể và thiết bị. Đoạn mã sau đây cho biết cách lấy một thực thể của cảm biến tiệm cận mặc định:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
Cảm biến tiệm cận thường được dùng để xác định khoảng cách từ đầu của một người đến mặt của thiết bị cầm tay (ví dụ: khi người dùng đang thực hiện hoặc nhận cuộc gọi điện thoại). Hầu hết các cảm biến tiệm cận đều trả về khoảng cách tuyệt đối (tính bằng cm), nhưng một số cảm biến chỉ trả về giá trị gần và xa.
Lưu ý: Trên một số mẫu thiết bị, cảm biến độ gần nằm bên dưới màn hình. Điều này có thể khiến dấu chấm nhấp nháy xuất hiện trên màn hình nếu bạn bật cảm biến khi màn hình đang bật.
Đoạn mã sau đây cho biết cách sử dụng cảm biến tiệm cận:
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var proximity: 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 proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val distance = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() proximity?.also { proximity -> sensorManager.registerListener(this, proximity, 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 proximity; @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); proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
Lưu ý: Một số cảm biến độ gần trả về các giá trị nhị phân biểu thị "gần" hoặc "xa". Trong trường hợp này, cảm biến thường báo cáo giá trị phạm vi tối đa ở trạng thái xa và giá trị thấp hơn ở trạng thái gần. Thông thường, giá trị ở xa là giá trị > 5 cm, nhưng giá trị này có thể thay đổi tuỳ theo từng cảm biến. Bạn có thể xác định phạm vi tối đa của cảm biến bằng phương thức getMaximumRange()
.