Nền tảng Android cung cấp 2 cảm biến cho phép bạn xác định vị trí của thiết bị: cảm biến trường địa từ và gia tốc kế. Hệ điều hành Android nền tảng này cũng cung cấp một cảm biến cho phép xác định khoảng cách một thiết bị là ở một đối tượng (được gọi là cảm biến độ gần). Chiến lược phát hành đĩa đơn cảm biến trường địa từ và cảm biến độ gần đều dựa trên phần cứng. Thường gặp nhất các nhà sản xuất điện thoại di động và máy tính bảng có cảm biến trường địa từ. Tương tự, các nhà sản xuất điện thoại di động thường bao gồm một cảm biến độ gần để xác định thời điểm điện thoại di động được đưa gần khuôn mặt người dùng (ví dụ: trong khi đang dùng điện thoại cuộc gọi). Để xác định hướng của thiết bị, bạn có thể sử dụng kết quả đo từ gia tốc kế của thiết bị và cảm biến trường địa từ.
Lưu ý: Cảm biến hướng không còn được dùng trong Android 2.2 (API cấp 8) và loại cảm biến hướng không còn được dù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 hệ quy chiếu của thế giới. Ví dụ: bạn có thể sử dụng trường địa từ cảm biến 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 bắc từ tính. Bạn cũng có thể sử dụng các cảm biến này để xác định hướng của thiết bị trong hệ quy 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 hoặc chuyển động của thiết bị, như rung, nghiêng hoặc lực đẩy (để biết thêm thông tin, hãy xem bài viết Cảm biến chuyển động).
Cảm biến trường địa từ và gia tốc kế trả về các mảng đa chiều
giá trị cảm biến cho mỗi SensorEvent
. Ví dụ:
cảm biến trường địa từ cung cấp các giá trị cường độ trường địa từ cho
từng trục toạ độ trong một sự kiện cảm biến. Tương tự,
cảm biến gia tốc kế đo lường gia tốc áp dụng cho thiết bị trong khoảng thời gian
sự kiện của cảm biến. Để biết thêm thông tin về hệ toạ độ được sử dụng
theo cảm biến, hãy xem
Hệ thống toạ độ cảm biến. Cảm biến độ gần cung cấp một giá trị duy nhất
cho từng 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.
Cảm biến | Dữ liệu sự kiện của cảm biến | Mô tả | Đơn vị đo |
---|---|---|---|
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(9/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(9/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 độ trường địa từ dọc theo trục x. | μT |
SensorEvent.values[1] |
Cường độ trường địa từ dọc theo trục y. | ||
SensorEvent.values[2] |
Cường độ trường địa từ dọc theo trục z. | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
Cường độ trường địa từ (không cần hiệu chỉnh bằng sắt cứng) dọc theo trục x. | μT |
SensorEvent.values[1] |
Cường độ trường địa từ (không cần hiệu chuẩn bằng sắt cứng) dọc theo trục y. | ||
SensorEvent.values[2] |
Cường độ địa từ (không cần hiệu chuẩn bằng sắt cứng) dọc theo trục z. | ||
SensorEvent.values[3] |
Ước tính độ lệch sắt dọc theo trục x. | ||
SensorEvent.values[4] |
Ước tính độ chệch hướng 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] |
Góc phương vị (góc xung quanh trục z). | Độ |
SensorEvent.values[1] |
Độ cao (góc xung quanh trục x). | ||
SensorEvent.values[2] |
Cuộn (góc quanh trục y). | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
Khoảng cách từ đối tượng.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 pháp thay thế để thu nạp thiết bị hướng, được thảo luận trong bài viết 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 giá trị nhị phân gần gũi.
Dùng cảm biến vectơ xoay trò chơi
Cảm biến vectơ xoay trò chơi giống hệt với Xoay cảm biến vectơ, ngoại trừ việc cảm biến không sử dụng trường địa từ. Do đó, trục Y không trỏ về hướng bắc mà thay vào đó là đến một số tham chiếu khác. Tham chiếu đó được phép trôi theo cùng thứ tự độ lớn khi con quay hồi chuyển trôi quanh trục Z.
Vì cảm biến vectơ xoay trò chơi không sử dụng từ trường, nên độ xoay tương đối chính xác hơn và không chịu ảnh hưởng của những thay đổi 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 vị trí phía bắc và vectơ xoay bình 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 bạn biết cách tải một thực thể của vectơ xoay trò chơi mặc định cảm biến:
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 địa từ
Cảm biến vectơ xoay địa từ tương tự như cảm biến vectơ xoay, nhưng thiết bị 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 vectơ xoay thông thường cảm biến 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 dữ liệu xoay thông tin trong nền mà không tốn quá nhiều pin. Cảm biến này phát huy hiệu quả nhất khi dùng kết hợp với việc phân lô.
Đoạn mã sau đây hướng dẫn bạn cách nhận bản sao của xoay địa từ mặc định cảm biến vectơ:
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ể giám sát vị trí của thiết bị so với hệ quy chiếu của trái đất (cụ thể là từ bắc cực). Mã sau đây cho bạn biết cách tính toán hướng:
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 các góc hướng bằng cách sử dụng địa từ của thiết bị cảm biến trường kết hợp với gia tốc kế trên thiết bị. Sử dụng hai cảm biến phần cứng, hệ thống sẽ cung cấp dữ liệu cho ba loại cảm biến các góc hướng:
- Góc phương vị (độ quay 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ừ tính. Nếu cạnh trên của thiết bị hướng về phía bắc có từ tính, thì góc phương vị bằng 0 độ; nếu cạnh trên hướng về phía nam, góc phương vị là 180 độ. Tương tự, nếu cạnh trên hướng về phía đông, góc phương vị là 90 độ và nếu cạnh trên mặt hướng Tây, góc phương vị là 270 độ.
- Độ cao (độ 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 xuống đất. Nếu bạn giữ thiết bị song song với mặt đất bằng phía dưới cạnh gần bạn nhất và nghiêng cạnh trên của thiết bị về phía mặt đất, góc ném trở thành góc dương. Đang 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—nguyên nhân là do góc nghiêng trở thành góc âm. Phạm vi của các giá trị là từ -90 độ đến 90 độ.
- Roll (độ quay quanh trục y). Đây là góc giữa mặt phẳng vuông góc với màn hình của thiết bị và 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 sao cho 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, góc cuộn trở nên dương. Nghiêng theo hướng ngược lại hướng — di chuyển cạnh phải của thiết bị về phía mặt đất — làm cho góc cuộn trở nên âm. Phạm vi của các giá trị là -180 độ tới 180 độ.
Lưu ý: Định nghĩa cuộn của cảm biến đã thay đổi để phản ánh phần lớn các phương pháp triển khai trong hệ sinh thái cảm biến địa lý.
Lưu ý rằng các góc này làm việc từ một hệ toạ độ khác với một ký tự được sử dụng trong ngành hàng không (cho cử chỉ "ngáp, cao độ và tung xúc xắc). Trong hệ thống hàng không, trục x 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ừ gia tốc kế và cảm biến trường địa từ. Do quá tải
xử lý có liên quan, độ chính xác và độ chính xác của hướng
cảm biến bị giảm kích thước. Cụ thể, cảm biến này chỉ đáng tin cậy khi người dùng cuộn
góc bằng 0. Do đó, cảm biến hướng không được dùng nữa trong Android
2.2 (API cấp 8) và loại cảm biến hướng không còn được dùng trong Android
4,4 W (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 getRotationMatrix()
kết hợp với
Phương thức getOrientation()
để tính toán các giá trị hướng, như trong mã mẫu sau. Là một phần
của quá trình này, bạn có thể sử dụng
remapCoordinateSystem()
để dịch các giá trị hướng sang khung hình của ứng dụng
tham chiếu.
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. } }
Thường thì bạn không cần thực hiện bất kỳ quá trình xử lý hay lọc dữ liệu nào các góc hướng thô của thiết bị ngoài các góc dịch của cảm biến hệ toạ độ với hệ quy chiếu của ứng dụng của bạn.
Sử dụng cảm biến trường địa từ
Cảm biến trường địa từ cho phép bạn theo dõi sự thay đổi trong từ trường của trái đất. Chiến lược phát hành đĩa đơn đoạn mã sau đây cho bạn biết cách tải một phiên bản của cảm biến 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) hoặc cao hơn, cảm biến này bị giới hạn tỷ lệ.
Cảm biến này cung cấp dữ liệu cường độ trường thô (tính bằng μT) cho từng trục toạ độ trong số 3 trục toạ độ.
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 vectơ xoay
cảm biến để xác định chuyển động quay thô hoặc bạn có thể sử dụng gia tốc kế và trường địa từ
cảm biến 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 getOrientation()
và phương thức getInclination()
để lấy góc phương vị
và dữ liệu về độ nghiêng địa từ.
Lưu ý: Khi thử nghiệm ứ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 mẫu hình-8.
Sử dụng từ kế chưa được hiệu chỉnh
Từ kế chưa được hiệu chỉnh tương tự như trường địa từ
cảm biến, ngoại trừ việc không áp dụng hiệu chỉnh cứng bằng sắt cho từ trường. Hiệu chuẩn tại nhà máy
và bù nhiệt độ vẫn được áp dụng cho từ trường. Từ kế chưa được hiệu chỉnh
rất hữu ích khi xử lý các ước tính về sắt cứng kém. 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 kết quả thô hơn và có thể bao gồm một số độ chệch, nhưng các phép đo của chúng có ít bước nhảy hơn từ các hiệu chỉnh được áp dụng qua lấy mẫu. Một số ứng dụng có thể muốn các kết quả chưa được hiệu chỉnh này mượt mà hơn và hiệu quả hơn đáng tin cậy. Ví dụ: nếu một ứng dụng đang cố gắng tiến hành hợp nhất cảm biến của riêng mình, thực sự có thể làm sai lệch kết quả.
Ngoài từ trường, từ kế chưa được hiệu chuẩn còn cung cấp độ chệch ước tính của sắt cứng trong mỗi trục. Mã sau đây cho bạn biết cách tải một thực thể của từ kế chưa được 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 độ gần cho phép bạn xác định một vật thể cách thiết bị bao xa. Nội dung sau đây mã cho bạn biết cách lấy bản sao của cảm biến độ gầ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 độ gần thường được dùng để xác định khoảng cách giữa đầu của một người so với khuôn mặt của điện thoại di động (ví dụ: khi người dùng đang thực hiện hoặc nhận cuộc gọi điện thoại). Thường gặp nhất cảm biến độ gần sẽ 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ề khoảng cách gần và giá trị xa.
Lưu ý: Trên một số mẫu thiết bị, cảm biến độ gần được đặt bên dưới màn hình, điều này có thể khiến một dấu chấm nhấp nháy xuất hiện trên màn hình nếu tính năng này được bật khi màn hình đang .
Mã sau đây cho bạn biết cách sử dụng cảm biến độ gầ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 đại diện cho
"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à có giá trị thấp hơn ở trạng thái gần. Thông thường, giá trị xa là một giá trị > 5 cm, nhưng chiều dài này có thể thay đổi
từ cảm biến đến 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 cách sử dụng phương thức getMaximumRange()
.