Android प्लैटफ़ॉर्म पर दो सेंसर उपलब्ध हैं. इनकी मदद से, डिवाइस की पोज़िशन का पता लगाया जा सकता है: जियोमैग्नेटिक फ़ील्ड सेंसर और एक्सलरोमीटर. Android प्लैटफ़ॉर्म पर एक सेंसर भी होता है. इससे यह पता लगाया जा सकता है कि डिवाइस का फ़ेस किसी ऑब्जेक्ट के कितना करीब है. इसे प्रॉक्सिमिटी सेंसर कहा जाता है. जियोमैग्नेटिक फ़ील्ड सेंसर और प्रॉक्सिमिटी सेंसर, हार्डवेयर पर आधारित होते हैं. ज़्यादातर हैंडसेट और टैबलेट मैन्युफ़ैक्चरर, जियोमैग्नेटिक फ़ील्ड सेंसर शामिल करते हैं. इसी तरह, हैंडसेट बनाने वाली कंपनियां आम तौर पर प्रॉक्सिमिटी सेंसर का इस्तेमाल करती हैं. इससे यह पता चलता है कि हैंडसेट को उपयोगकर्ता के चेहरे के पास कब लाया गया है. उदाहरण के लिए, फ़ोन कॉल के दौरान. किसी डिवाइस के ओरिएंटेशन का पता लगाने के लिए, डिवाइस के एक्सलरोमीटर और जियोमैग्नेटिक फ़ील्ड सेंसर की रीडिंग का इस्तेमाल किया जा सकता है.
ध्यान दें: ओरिएंटेशन सेंसर को Android 2.2 (एपीआई लेवल 8) में बंद कर दिया गया था. साथ ही, ओरिएंटेशन सेंसर टाइप को Android 4.4W (एपीआई लेवल 20) में बंद कर दिया गया था.
पोज़िशन सेंसर, दुनिया के फ़्रेम ऑफ़ रेफ़रंस में किसी डिवाइस की जगह की जानकारी का पता लगाने के लिए काम के होते हैं. उदाहरण के लिए, जियोमैग्नेटिक फ़ील्ड सेंसर का इस्तेमाल एक्सलरोमीटर के साथ करके, मैग्नेटिक नॉर्थ पोल के हिसाब से डिवाइस की पोज़िशन का पता लगाया जा सकता है. इन सेंसर का इस्तेमाल, अपने ऐप्लिकेशन के फ़्रेम ऑफ़ रेफ़रंस में डिवाइस के ओरिएंटेशन का पता लगाने के लिए भी किया जा सकता है. आम तौर पर, पोज़िशन सेंसर का इस्तेमाल डिवाइस की हलचल या गतिविधि को मॉनिटर करने के लिए नहीं किया जाता है. जैसे, डिवाइस को हिलाना, झुकाना या धक्का देना. ज़्यादा जानकारी के लिए, मोशन सेंसर देखें.
जियोमैग्नेटिक फ़ील्ड सेंसर और एक्सलरोमीटर, हर SensorEvent के लिए सेंसर वैल्यू के मल्टी-डाइमेंशनल ऐरे दिखाते हैं. उदाहरण के लिए, जियोमैग्नेटिक फ़ील्ड सेंसर, एक सेंसर इवेंट के दौरान तीनों कोऑर्डिनेट ऐक्सिस में से हर एक के लिए, जियोमैग्नेटिक फ़ील्ड की क्षमता की वैल्यू देता है. इसी तरह, एक्सलरोमीटर सेंसर, सेंसर इवेंट के दौरान डिवाइस पर लागू होने वाले एक्सलरेशन को मेज़र करता है. सेंसर के इस्तेमाल किए जाने वाले कोऑर्डिनेट सिस्टम के बारे में ज़्यादा जानकारी के लिए,
सेंसर कोऑर्डिनेट सिस्टम देखें. प्रॉक्सिमिटी सेंसर, हर सेंसर इवेंट के लिए एक वैल्यू देता है. टेबल 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_ORIENTATION1 |
SensorEvent.values[0] |
ऐज़िमथ (z-ऐक्सिस के आस-पास का ऐंगल). | डिग्री |
SensorEvent.values[1] |
पिच (X-ऐक्सिस के आस-पास का ऐंगल). | ||
SensorEvent.values[2] |
रोल (y-ऐक्सिस के आस-पास का ऐंगल). | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
ऑब्जेक्ट से दूरी.2 | सें॰मी॰ |
1इस सेंसर को Android 2.2 (एपीआई लेवल 8) में बंद कर दिया गया था. साथ ही, इस सेंसर टाइप को Android 4.4W (एपीआई लेवल 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);
सिस्टम, ओरिएंटेशन ऐंगल का हिसाब लगाने के लिए, डिवाइस के जियोमैग्नेटिक फ़ील्ड सेंसर और एक्सलरोमीटर का इस्तेमाल करता है. इन दोनों हार्डवेयर सेंसर का इस्तेमाल करके, सिस्टम इन तीन ओरिएंटेशन ऐंगल के लिए डेटा उपलब्ध कराता है:
- ऐज़िमथ (z ऐक्सिस के चारों ओर रोटेशन की डिग्री). यह डिवाइस के कंपास की मौजूदा दिशा और मैग्नेटिक नॉर्थ के बीच का ऐंगल होता है. अगर डिवाइस का ऊपरी हिस्सा मैग्नेटिक नॉर्थ की ओर है, तो ऐज़िमथ 0 डिग्री होता है. अगर ऊपरी हिस्सा साउथ की ओर है, तो ऐज़िमथ 180 डिग्री होता है. इसी तरह, अगर ऊपरी किनारा पूर्व की ओर है, तो ऐज़िमथ 90 डिग्री है. अगर ऊपरी किनारा पश्चिम की ओर है, तो ऐज़िमथ 270 डिग्री है.
- पिच (X ऐक्सिस के आस-पास रोटेशन की डिग्री). यह डिवाइस की स्क्रीन के पैरलल प्लेन और ज़मीन के पैरलल प्लेन के बीच का ऐंगल होता है. अगर डिवाइस को ज़मीन के पैरलल पकड़ा जाए और उसका निचला हिस्सा आपके सबसे नज़दीक हो और डिवाइस के ऊपरी हिस्से को ज़मीन की ओर झुकाया जाए, तो पिच ऐंगल पॉज़िटिव हो जाता है. डिवाइस को विपरीत दिशा में झुकाने पर, पिच ऐंगल नेगेटिव हो जाता है. इसके लिए, डिवाइस के ऊपरी किनारे को ज़मीन से दूर ले जाएं. वैल्यू की रेंज -90 डिग्री से 90 डिग्री तक होती है.
- रोल (y ऐक्सिस के आस-पास रोटेशन की डिग्री). यह डिवाइस की स्क्रीन के लंबवत तल और ज़मीन के लंबवत तल के बीच का कोण है. अगर डिवाइस को ज़मीन के पैरलल पकड़ा जाए और उसका निचला हिस्सा आपके सबसे करीब हो, तो डिवाइस के बाएं हिस्से को ज़मीन की ओर झुकाने पर रोल ऐंगल पॉज़िटिव हो जाता है. डिवाइस को इसके उलट दिशा में झुकाने पर, रोल ऐंगल नेगेटिव हो जाता है. जैसे, डिवाइस के दाएं किनारे को ज़मीन की ओर झुकाना. वैल्यू की रेंज -180 डिग्री से 180 डिग्री तक होती है.
ध्यान दें: सेंसर के रोल की परिभाषा में बदलाव किया गया है, ताकि जियोसेंसर नेटवर्क में ज़्यादातर लागू किए गए बदलावों को दिखाया जा सके.
ध्यान दें कि ये ऐंगल, एविएशन (यॉ, पिच, और रोल के लिए) में इस्तेमाल किए जाने वाले कोऑर्डिनेट सिस्टम से अलग कोऑर्डिनेट सिस्टम पर काम करते हैं. एविएशन सिस्टम में, x ऐक्सिस विमान के लंबे हिस्से के साथ-साथ, पूंछ से लेकर नाक तक होता है.
ओरिएंटेशन सेंसर, एक्सेलेरोमीटर और जियोमैग्नेटिक फ़ील्ड सेंसर से मिले रॉ सेंसर डेटा को प्रोसेस करके अपना डेटा हासिल करता है. ज़्यादा प्रोसेसिंग की वजह से, ओरिएंटेशन सेंसर की सटीक जानकारी देने की क्षमता कम हो जाती है. खास तौर पर, यह सेंसर सिर्फ़ तब भरोसेमंद होता है, जब रोल ऐंगल 0 हो. इस वजह से, Android 2.2 (एपीआई लेवल 8) में ओरिएंटेशन सेंसर को बंद कर दिया गया था. साथ ही, Android 4.4W (एपीआई लेवल 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 (एपीआई लेवल 31) या इसके बाद के वर्शन को टारगेट करता है, तो इस सेंसर के लिए अनुरोध संख्या सीमित की जाती है.
यह सेंसर, तीनों कोऑर्डिनेट ऐक्सिस के लिए, रॉ फ़ील्ड स्ट्रेंथ डेटा (μT में) उपलब्ध कराता है.
आम तौर पर, आपको इस सेंसर का इस्तेमाल सीधे तौर पर करने की ज़रूरत नहीं होती. इसके बजाय, रोटेशन वेक्टर सेंसर का इस्तेमाल करके, रोटेशन मूवमेंट का पता लगाया जा सकता है. इसके अलावा, रोटेशन मैट्रिक्स और इन्क्लिनेशन मैट्रिक्स पाने के लिए, एक्सलरोमीटर और जियोमैग्नेटिक फ़ील्ड सेंसर का इस्तेमाल, 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() तरीके का इस्तेमाल करके, सेंसर की ज़्यादा से ज़्यादा रेंज का पता लगाया जा सकता है.