แพลตฟอร์ม Android มีเซ็นเซอร์ 2 ตัวที่ช่วยให้คุณระบุตำแหน่ง ของอุปกรณ์ได้ ได้แก่ เซ็นเซอร์สนามแม่เหล็กโลกและตัวตรวจวัดความเร่ง แพลตฟอร์ม Android ยังมีเซ็นเซอร์ที่ช่วยให้คุณกำหนดได้ว่าใบหน้าของ อุปกรณ์อยู่ใกล้กับวัตถุมากน้อยเพียงใด (เรียกว่าพร็อกซิมิตีเซ็นเซอร์) เซ็นเซอร์สนามแม่เหล็กโลกและพร็อกซิมิตีเซ็นเซอร์เป็นแบบฮาร์ดแวร์ ผู้ผลิตโทรศัพท์และแท็บเล็ตส่วนใหญ่ จะใส่เซ็นเซอร์สนามแม่เหล็กโลกไว้ด้วย ในทำนองเดียวกัน ผู้ผลิตโทรศัพท์มักจะใส่พร็อกซิมิตีเซ็นเซอร์เพื่อตรวจหาว่าเมื่อใดที่ โทรศัพท์อยู่ใกล้กับใบหน้าของผู้ใช้ (เช่น ระหว่างการโทร ทางโทรศัพท์) หากต้องการกำหนดการวางแนวของอุปกรณ์ คุณสามารถใช้ค่าที่อ่านได้จาก ตัวตรวจวัดความเร่งของอุปกรณ์และเซ็นเซอร์สนามแม่เหล็กโลก
หมายเหตุ: เราเลิกใช้เซ็นเซอร์การวางแนวใน Android 2.2 (API ระดับ 8) และเลิกใช้ประเภทเซ็นเซอร์การวางแนวใน Android 4.4W (API ระดับ 20)
เซ็นเซอร์ตำแหน่งมีประโยชน์ในการกำหนดตำแหน่งจริงของอุปกรณ์ในกรอบอ้างอิงของโลก เช่น คุณสามารถใช้เซ็นเซอร์สนามแม่เหล็กโลก ร่วมกับตัวตรวจวัดความเร่งเพื่อระบุตำแหน่งของอุปกรณ์ เทียบกับขั้วแม่เหล็กเหนือ นอกจากนี้ คุณยังใช้เซ็นเซอร์เหล่านี้เพื่อ กำหนดการวางแนวของอุปกรณ์ในกรอบอ้างอิงของแอปพลิเคชันได้ด้วย โดยปกติแล้วจะไม่ใช้เซ็นเซอร์ตำแหน่งเพื่อตรวจสอบการเคลื่อนไหวของอุปกรณ์ เช่น การเขย่า การเอียง หรือการผลัก (ดูข้อมูลเพิ่มเติมได้ที่เซ็นเซอร์ตรวจจับการเคลื่อนไหว)
เซ็นเซอร์สนามแม่เหล็กโลกและเครื่องวัดความเร่งจะแสดงผลอาร์เรย์หลายมิติ
ของค่าเซ็นเซอร์สำหรับแต่ละ SensorEvent
เช่น เซ็นเซอร์สนามแม่เหล็กโลกจะให้ค่าความแรงของสนามแม่เหล็กโลกสำหรับแกนพิกัดทั้ง 3 แต่ละแกนในระหว่างเหตุการณ์เซ็นเซอร์เดียว ในทำนองเดียวกัน เซ็นเซอร์ตัวตรวจวัดความเร่งจะวัดความเร่งที่ใช้กับอุปกรณ์ในระหว่างเหตุการณ์เซ็นเซอร์ ดูข้อมูลเพิ่มเติมเกี่ยวกับระบบพิกัดที่เซ็นเซอร์ใช้ได้ที่
ระบบพิกัดของเซ็นเซอร์ เซ็นเซอร์ตรวจจับระยะจะให้ค่าเดียว
สำหรับเหตุการณ์เซ็นเซอร์แต่ละรายการ ตารางที่ 1 สรุปเซ็นเซอร์ตำแหน่งที่
รองรับในแพลตฟอร์ม Android
ตารางที่ 1 เซ็นเซอร์ตำแหน่งที่แพลตฟอร์ม Android รองรับ
เซ็นเซอร์ | ข้อมูลเหตุการณ์เซ็นเซอร์ | คำอธิบาย | หน่วยวัด |
---|---|---|---|
TYPE_GAME_ROTATION_VECTOR |
SensorEvent.values[0] |
คอมโพเนนต์เวกเตอร์การหมุนตามแกน x (x * sin(θ/2)) | ไม่มีหน่วย |
SensorEvent.values[1] |
คอมโพเนนต์เวกเตอร์การหมุนตามแกน y (y * sin(θ/2)) | ||
SensorEvent.values[2] |
คอมโพเนนต์เวกเตอร์การหมุนตามแกน z (z * sin(θ/2)) | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR |
SensorEvent.values[0] |
คอมโพเนนต์เวกเตอร์การหมุนตามแกน x (x * sin(θ/2)) | ไม่มีหน่วย |
SensorEvent.values[1] |
คอมโพเนนต์เวกเตอร์การหมุนตามแกน y (y * sin(θ/2)) | ||
SensorEvent.values[2] |
คอมโพเนนต์เวกเตอร์การหมุนตามแกน z (z * sin(θ/2)) | ||
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
ความแรงของสนามแม่เหล็กโลกตามแกน x | μT |
SensorEvent.values[1] |
ความแรงของสนามแม่เหล็กโลกตามแกน y | ||
SensorEvent.values[2] |
ความแรงของสนามแม่เหล็กโลกตามแกน z | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
ความแรงของสนามแม่เหล็กโลก (ไม่มีการปรับเทียบเหล็กกล้า) ตามแกน x | μT |
SensorEvent.values[1] |
ความแรงของสนามแม่เหล็กโลก (โดยไม่มีการปรับเทียบฮาร์ดไอรอน) ตามแกน y | ||
SensorEvent.values[2] |
ความแรงของสนามแม่เหล็กโลก (โดยไม่มีการปรับเทียบฮาร์ดไอรอน) ตามแกน z | ||
SensorEvent.values[3] |
การประมาณอคติของเหล็กตามแกน x | ||
SensorEvent.values[4] |
การประมาณอคติของเหล็กตามแกน y | ||
SensorEvent.values[5] |
การประมาณค่าความเอนเอียงของเหล็กตามแกน Z | ||
TYPE_ORIENTATION 1 |
SensorEvent.values[0] |
แอซิมัท (มุมรอบแกน Z) | องศา |
SensorEvent.values[1] |
ระดับเสียง (มุมรอบแกน x) | ||
SensorEvent.values[2] |
การหมุน (มุมรอบแกน Y) | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
ระยะห่างจากวัตถุ2 | ซม. |
1เซ็นเซอร์นี้เลิกใช้งานใน Android 2.2 (API ระดับ 8) และเซ็นเซอร์ประเภทนี้เลิกใช้งานใน Android 4.4W (API ระดับ 20) เฟรมเวิร์กเซ็นเซอร์มีวิธีการอื่นในการรับการวางแนวของอุปกรณ์ ซึ่งจะกล่าวถึงในหัวข้อคำนวณ การวางแนวของอุปกรณ์
2 พร็อกซิมิตีเซ็นเซอร์บางรุ่นให้ค่าไบนารีเท่านั้น ซึ่งแสดงถึงระยะใกล้และไกล
ใช้เซ็นเซอร์เวกเตอร์การหมุนของเกม
เซ็นเซอร์เวกเตอร์การหมุนของเกมจะเหมือนกับเซ็นเซอร์เวกเตอร์ การหมุนทุกประการ ยกเว้นว่าจะไม่ใช้สนามแม่เหล็กโลก ดังนั้นแกน Y จึงไม่ได้ชี้ไปทางเหนือ แต่ชี้ไปยังการอ้างอิงอื่นๆ การอ้างอิงดังกล่าวจะเลื่อนได้ตาม ลำดับขนาดเดียวกับการเลื่อนของเครื่องวัดการหมุนรอบแกน Z
เนื่องจากเซ็นเซอร์เวกเตอร์การหมุนของเกมไม่ได้ใช้สนามแม่เหล็ก การหมุนสัมพัทธ์จึงแม่นยำกว่าและไม่ได้รับผลกระทบจากการเปลี่ยนแปลงของสนามแม่เหล็ก ใช้เซ็นเซอร์นี้ในเกมหากคุณไม่สนใจว่าทิศเหนืออยู่ที่ใด และเวกเตอร์การหมุนปกติไม่ตรงกับความต้องการของคุณ เนื่องจากต้องอาศัยสนามแม่เหล็ก
โค้ดต่อไปนี้แสดงวิธีรับอินสแตนซ์ของเวกเตอร์การหมุนของเกมเริ่มต้น เซ็นเซอร์
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);
ใช้เซ็นเซอร์เวกเตอร์การหมุนทางแม่เหล็กโลก
เซ็นเซอร์เวกเตอร์การหมุนของสนามแม่เหล็กโลกคล้ายกับเซ็นเซอร์เวกเตอร์การหมุน แต่ไม่ได้ใช้เครื่องวัดการหมุน ความแม่นยำของเซ็นเซอร์นี้ต่ำกว่าเซ็นเซอร์เวกเตอร์การหมุนปกติ แต่จะช่วยลดการใช้พลังงาน ใช้เซ็นเซอร์นี้เฉพาะในกรณีที่ต้องการรวบรวมข้อมูลการหมุน ในเบื้องหลังโดยไม่ใช้แบตเตอรี่มากเกินไป เซ็นเซอร์นี้มีประโยชน์มากที่สุดเมื่อใช้ ร่วมกับการประมวลผลเป็นกลุ่ม
โค้ดต่อไปนี้แสดงวิธีรับอินสแตนซ์ของเซ็นเซอร์เวกเตอร์การหมุนตามสนามแม่เหล็กโลกเริ่มต้น
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);
คำนวณการวางแนวของอุปกรณ์
การคำนวณการวางแนวของอุปกรณ์ช่วยให้คุณตรวจสอบตำแหน่งของ อุปกรณ์เทียบกับกรอบอ้างอิงของโลก (โดยเฉพาะขั้วเหนือแม่เหล็ก) ได้ โค้ดต่อไปนี้แสดงวิธีคำนวณการวางแนวของอุปกรณ์
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);
ระบบจะคำนวณมุมการวางแนวโดยใช้เซ็นเซอร์สนามแม่เหล็กโลกของอุปกรณ์ร่วมกับเครื่องวัดความเร่งของอุปกรณ์ ระบบจะใช้เซ็นเซอร์ฮาร์ดแวร์ 2 ตัวนี้เพื่อแสดงข้อมูลสำหรับมุมการวางแนว 3 มุมต่อไปนี้
- แอซิมัท (องศาของการหมุนรอบแกน -z) ซึ่งเป็น มุมระหว่างทิศทางเข็มทิศปัจจุบันของอุปกรณ์กับทิศเหนือแม่เหล็ก หากขอบด้านบนของอุปกรณ์หันไปทางเหนือแม่เหล็ก แอซิมัทจะเป็น 0 องศา และหากขอบด้านบนหันไปทางใต้ แอซิมัทจะเป็น 180 องศา ในทำนองเดียวกัน หากขอบด้านบนหันไปทางทิศตะวันออก แอซิมัทจะเป็น 90 องศา และหากขอบด้านบน หันไปทางทิศตะวันตก แอซิมัทจะเป็น 270 องศา
- ระดับความสูงต่ำ (องศาของการหมุนรอบแกน x) นี่คือ มุมระหว่างระนาบที่ขนานกับหน้าจอของอุปกรณ์และระนาบที่ขนาน กับพื้น หากถืออุปกรณ์ขนานกับพื้นโดยให้ขอบด้านล่าง อยู่ใกล้ตัวคุณมากที่สุด แล้วเอียงขอบด้านบนของอุปกรณ์ลงไปทางพื้น มุมพิตช์จะเป็นบวก การเอียงไปในทิศทางตรงกันข้าม - การเลื่อนขอบด้านบนของอุปกรณ์ออกจากพื้น - จะทำให้ มุมพิตช์กลายเป็นค่าลบ ช่วงของค่าคือ -90 องศาถึง 90 องศา
- การหมุน (องศาของการหมุนรอบแกน y) นี่คือ มุมระหว่างระนาบที่ตั้งฉากกับหน้าจอของอุปกรณ์และระนาบที่ ตั้งฉากกับพื้น หากถืออุปกรณ์ขนานกับพื้น โดยให้ขอบด้านล่างอยู่ใกล้ตัวคุณมากที่สุด แล้วเอียงขอบด้านซ้ายของอุปกรณ์ เข้าหาพื้น มุมม้วนจะเป็นค่าบวก การเอียงในทิศทางตรงกันข้าม โดยการเลื่อนขอบด้านขวาของอุปกรณ์เข้าหาพื้น จะทำให้มุมม้วนเป็นค่าลบ ช่วงของค่าคือ -180 องศา ถึง 180 องศา
หมายเหตุ: คำจำกัดความการหมุนของเซ็นเซอร์มีการเปลี่ยนแปลงเพื่อให้สอดคล้องกับ การใช้งานส่วนใหญ่ในระบบนิเวศของเซ็นเซอร์ภูมิศาสตร์
โปรดทราบว่ามุมเหล่านี้ทำงานในระบบพิกัดที่แตกต่างจากระบบที่ใช้ในการบิน (สำหรับการหมุนรอบแกนตั้ง การหมุนรอบแกนนอน และการหมุนรอบแกนยาว) ในระบบการบิน แกน X จะอยู่ตามด้านยาวของเครื่องบินจากหางไปจมูก
เซ็นเซอร์การวางแนวจะดึงข้อมูลโดยการประมวลผลข้อมูลเซ็นเซอร์ดิบ
จากเครื่องวัดความเร่งและเซ็นเซอร์สนามแม่เหล็กโลก เนื่องจากต้องมีการประมวลผลจำนวนมาก ความแม่นยำและความเที่ยงตรงของเซ็นเซอร์การวางแนวจึงลดลง กล่าวคือ เซ็นเซอร์นี้เชื่อถือได้เฉพาะเมื่อมุมม้วน
เป็น 0 ด้วยเหตุนี้ เราจึงเลิกใช้เซ็นเซอร์การวางแนวใน Android 2.2 (API ระดับ 8) และเลิกใช้ประเภทเซ็นเซอร์การวางแนวใน Android 4.4W (API ระดับ 20)
เราขอแนะนําให้คุณใช้เมธอด getRotationMatrix()
ร่วมกับเมธอด getOrientation()
เพื่อคํานวณค่าการวางแนวแทนการใช้ข้อมูลดิบจากเซ็นเซอร์การวางแนว ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้ ในกระบวนการนี้ คุณสามารถใช้วิธีremapCoordinateSystem()
เพื่อแปลค่าการวางแนวเป็นกรอบอ้างอิงของแอปพลิเคชัน
ได้
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. } }
โดยปกติแล้วคุณไม่จำเป็นต้องประมวลผลหรือกรองข้อมูลมุมการวางแนวแบบดิบของอุปกรณ์ นอกเหนือจากการแปลงระบบพิกัดของเซ็นเซอร์ เป็นกรอบอ้างอิงของแอปพลิเคชัน
ใช้เซ็นเซอร์สนามแม่เหล็กโลก
เซ็นเซอร์ตรวจจับคลื่นแม่เหล็กไฟฟ้าช่วยให้คุณตรวจสอบการเปลี่ยนแปลงของสนามแม่เหล็กโลกได้ โค้ดต่อไปนี้แสดงวิธีรับอินสแตนซ์ของเซ็นเซอร์สนามแม่เหล็กไฟฟ้าเริ่มต้น
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);
หมายเหตุ: หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป เซ็นเซอร์นี้จะจำกัดอัตรา
เซ็นเซอร์นี้ให้ข้อมูลความแรงของสนามดิบ (ในหน่วย μT) สำหรับแกนพิกัดทั้ง 3 แกน
โดยปกติแล้ว คุณไม่จำเป็นต้องใช้เซ็นเซอร์นี้โดยตรง แต่คุณสามารถใช้เซ็นเซอร์เวกเตอร์การหมุน
เพื่อระบุการเคลื่อนไหวแบบหมุนดิบ หรือใช้เซ็นเซอร์ตัวตรวจวัดความเร่งและสนามแม่เหล็กโลก
ร่วมกับเมธอด getRotationMatrix()
เพื่อรับเมทริกซ์การหมุนและเมทริกซ์ความเอียงได้ จากนั้นคุณจะใช้เมทริกซ์เหล่านี้กับเมธอด getOrientation()
และ getInclination()
เพื่อรับข้อมูลมุมราบ
และความเอียงของสนามแม่เหล็กโลกได้
หมายเหตุ: เมื่อทดสอบแอป คุณสามารถปรับปรุงความแม่นยำของเซ็นเซอร์ได้โดยการโบกอุปกรณ์เป็นรูปเลข 8
ใช้แมกนีโตมิเตอร์ที่ยังไม่ได้ปรับเทียบ
เครื่องวัดค่าความเข้มข้นของสนามแม่เหล็กที่ยังไม่ได้ปรับเทียบจะคล้ายกับเซ็นเซอร์
สนามแม่เหล็กโลก ยกเว้นว่าจะไม่มีการปรับเทียบแม่เหล็กถาวรกับสนามแม่เหล็ก การปรับเทียบจากโรงงาน
และการชดเชยอุณหภูมิจะยังคงมีผลกับสนามแม่เหล็ก แมกนีโตมิเตอร์ที่ยังไม่ได้ปรับเทียบ
มีประโยชน์ในการจัดการการประมาณค่าฮาร์ดไอรอนที่ไม่ถูกต้อง โดยทั่วไปแล้ว geomagneticsensor_event.values[0]
จะใกล้เคียงกับ uncalibrated_magnetometer_event.values[0] -
uncalibrated_magnetometer_event.values[3]
กล่าวคือ
calibrated_x ~= uncalibrated_x - bias_estimate_x
หมายเหตุ: เซ็นเซอร์ที่ไม่ได้ปรับเทียบจะให้ผลลัพธ์ดิบมากกว่าและอาจ มีอคติอยู่บ้าง แต่การวัดของเซ็นเซอร์จะมีการเปลี่ยนแปลงน้อยกว่าจากการแก้ไขที่ใช้ผ่าน การปรับเทียบ แอปพลิเคชันบางอย่างอาจต้องการผลลัพธ์ที่ไม่ได้ปรับเทียบเหล่านี้เนื่องจากมีความราบรื่นและ เชื่อถือได้มากกว่า เช่น หากแอปพลิเคชันพยายามทำการรวมเซ็นเซอร์ด้วยตัวเอง การแนะนำการปรับเทียบอาจทำให้ผลลัพธ์บิดเบือนได้
นอกจากสนามแม่เหล็กแล้ว แมกนีโตมิเตอร์ที่ยังไม่ได้ปรับเทียบยังให้ค่า อคติของเหล็กแข็งโดยประมาณในแต่ละแกนด้วย โค้ดต่อไปนี้แสดงวิธีรับอินสแตนซ์ของ แมกนีโตมิเตอร์เริ่มต้นที่ไม่ได้ปรับเทียบ
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);
ใช้พร็อกซิมิตีเซ็นเซอร์
พร็อกซิมิตีเซ็นเซอร์ช่วยให้คุณทราบว่าวัตถุอยู่ห่างจากอุปกรณ์เท่าใด โค้ดต่อไปนี้ แสดงวิธีรับอินสแตนซ์ของเซ็นเซอร์ตรวจจับระยะใกล้เริ่มต้น
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);
โดยปกติแล้ว เซ็นเซอร์ตรวจจับระยะใกล้จะใช้เพื่อกำหนดว่าศีรษะของบุคคลอยู่ห่างจากด้านหน้า ของอุปกรณ์โทรศัพท์มือถือมากน้อยเพียงใด (เช่น เมื่อผู้ใช้โทรออกหรือรับสาย) เซ็นเซอร์ตรวจจับความใกล้ส่วนใหญ่จะแสดงผลระยะทางสัมบูรณ์เป็นเซนติเมตร แต่บางเซ็นเซอร์จะแสดงผลเฉพาะค่าใกล้และไกล
หมายเหตุ: ในอุปกรณ์บางรุ่น พร็อกซิมิตีเซ็นเซอร์จะอยู่ใต้หน้าจอ ซึ่งอาจทำให้จุดกะพริบปรากฏบนหน้าจอหากเปิดใช้ขณะที่หน้าจอเปิดอยู่
โค้ดต่อไปนี้แสดงวิธีใช้พร็อกซิมิตีเซ็นเซอร์
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); } }
หมายเหตุ: พร็อกซิมิตีเซ็นเซอร์บางตัวจะแสดงค่าไบนารีที่แสดงถึง "ใกล้" หรือ "ไกล"
ในกรณีนี้ เซ็นเซอร์มักจะรายงานค่าช่วงสูงสุดในสถานะไกล
และรายงานค่าที่น้อยกว่าในสถานะใกล้ โดยปกติแล้ว ค่าไกลจะเป็นค่าที่มากกว่า 5 ซม. แต่ค่านี้อาจแตกต่างกันไป
ในแต่ละเซ็นเซอร์ คุณกำหนดช่วงสูงสุดของเซ็นเซอร์ได้โดยใช้getMaximumRange()
วิธี