Sensors API डिवाइस के हार्डवेयर सेंसर तक पहुँचने के लिए Android प्लेटफ़ॉर्म का एक इंटरफ़ेस है। API एक्सीलरोमीटर, जायरोस्कोप, मैग्नेटोमीटर, लाइट सेंसर और अन्य सेंसर से डेटा प्राप्त करने का एक एकीकृत तरीका प्रदान करता है। Google, 2026 के अनुसार, 95% से अधिक आधुनिक Android डिवाइस कम से कम तीन प्रकार के सेंसर से लैस हैं, जो संदर्भ-जागरूक एप्लिकेशन विकसित करने के व्यापक अवसर खोलता है।
मुख्य बातें
Sensors API Android Framework का एक सॉफ़्टवेयर इंटरफ़ेस है जो डेवलपर्स को मोबाइल डिवाइस के हार्डवेयर सेंसर तक पहुँच प्रदान करता है। API संस्करण 1.0 से Android SDK का हिस्सा रहा है और android.hardware पैकेज के माध्यम से उपलब्ध है। इंटरफ़ेस विभिन्न निर्माताओं — Qualcomm, MediaTek, Samsung Exynos — के सेंसर कार्यान्वयन के बीच अंतर को एब्स्ट्रैक्ट करता है और सेंसर के साथ काम करने का एक एकीकृत मॉडल प्रदान करता है।
API तीन मुख्य संचालन की अनुमति देता है: उपलब्ध सेंसर की सूची प्राप्त करना, डेटा प्राप्त करने के लिए श्रोताओं को पंजीकृत करना और अपडेट दर प्रबंधित करना। SensorManager सभी संचालन के लिए केंद्रीय पहुँच बिंदु के रूप में कार्य करता है। सिस्टम onSensorChanged कॉलबैक के माध्यम से एप्लिकेशन को सूचित करता है, जो float मानों की एक सरणी के साथ SensorEvent ऑब्जेक्ट पास करता है।
Android के अस्तित्व के दौरान, API विकास के कई चरणों से गुज़रा है। संस्करण 2.3 (Gingerbread) ने बैच प्रोसेसिंग के लिए समर्थन प्रस्तुत किया — बिजली की खपत को कम करने के लिए सेंसर इवेंट को समूहित करना। Android 4.0 (Ice Cream Sandwich) ने वर्चुअल सेंसर Gravity और Linear Acceleration जोड़े। Android 8.0 से शुरू करके, सिस्टम ने गोपनीयता बढ़ाने के लिए सेंसर तक बैकग्राउंड पहुँच को प्रतिबंधित कर दिया।
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensorList: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
sensorList.forEach { sensor ->
Log.d("सेंसर", "${sensor.name} — ${sensor.type}")
}
सभी डिवाइस में सेंसर का एक ही सेट नहीं होता। एक एप्लिकेशन को श्रोता पंजीकृत करने से पहले किसी विशिष्ट सेंसर की उपलब्धता की जाँच करनी चाहिए। Android Emulator केवल सीमित सेंसर सेट — एक्सीलरोमीटर और मैग्नेटोमीटर का समर्थन करता है। अन्य सेंसर के परीक्षण के लिए भौतिक डिवाइस की आवश्यकता होती है। Android 12 से शुरू करके, एप्लिकेशन को मेनिफ़ेस्ट में सेंसर उपयोग घोषित करना होगा।
Android सभी सेंसर को तीन श्रेणियों में वर्गीकृत करता है: Motion, Position और Environment। Motion सेंसर में एक्सीलरोमीटर, जायरोस्कोप और स्टेप काउंटर शामिल हैं। Position सेंसर में मैग्नेटोमीटर और ओरिएंटेशन शामिल हैं। Environment सेंसर में प्रकाश, दबाव, तापमान और आर्द्रता शामिल हैं।
| श्रेणी | सेंसर | प्रकार (स्थिरांक) | भौतिक/वर्चुअल |
|---|---|---|---|
| Motion | एक्सीलरोमीटर | TYPE_ACCELEROMETER | भौतिक |
| Motion | जायरोस्कोप | TYPE_GYROSCOPE | भौतिक |
| Motion | स्टेप काउंटर | TYPE_STEP_COUNTER | भौतिक |
| Motion | Gravity | TYPE_GRAVITY | वर्चुअल |
| Position | मैग्नेटोमीटर | TYPE_MAGNETIC_FIELD | भौतिक |
| Position | Rotation Vector | TYPE_ROTATION_VECTOR | वर्चुअल |
| Environment | प्रकाश | TYPE_LIGHT | भौतिक |
| Environment | दबाव | TYPE_PRESSURE | भौतिक |
एक्सीलरोमीटर तीन अक्षों — X, Y और Z के साथ m/s² में त्वरण मापता है। मानों में गुरुत्वाकर्षण शामिल है (स्थिर अवस्था में Z अक्ष के साथ 9.8 m/s²)। जायरोस्कोप rad/s — में कोणीय वेग मापता है, प्रत्येक अक्ष के चारों ओर डिवाइस की घूर्णन गति। इन दो सेंसर के संयोजन का उपयोग नेविगेशन, गेम और AR एप्लिकेशन में किया जाता है।
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) {}
}
मैग्नेटोमीटर (TYPE_MAGNETIC_FIELD) तीन अक्षों के साथ माइक्रोटेस्ला (µT) में चुंबकीय क्षेत्र मापता है। इसका उपयोग डिजिटल कंपास के रूप में किया जाता है — एक्सीलरोमीटर के साथ मिलकर, यह डिवाइस के अज़ीमुथ को निर्धारित करता है। Rotation Vector एक वर्चुअल सेंसर है जो सटीक ओरिएंटेशन निर्धारण के लिए जायरोस्कोप, एक्सीलरोमीटर और मैग्नेटोमीटर से डेटा को फ़्यूज़ करता है।
प्रकाश सेंसर (TYPE_LIGHT) लक्स (lx) में परिवेशी प्रकाश स्तर मापता है। इसका उपयोग स्वचालित स्क्रीन चमक समायोजन के लिए किया जाता है। दबाव सेंसर (TYPE_PRESSURE) हेक्टोपास्कल (hPa) में वायुमंडलीय दबाव मापता है — नेविगेशन एप्लिकेशन में समुद्र तल से ऊँचाई निर्धारित करने के लिए उपयोग किया जाता है।
Sensors API क्लाइंट-सर्वर आर्किटेक्चर पर बनाया गया है। एप्लिकेशन क्लाइंट के रूप में कार्य करता है, और SensorManager Android सिस्टम सेवा के रूप में कार्य करता है। जब एप्लिकेशन registerListener के माध्यम से एक श्रोता पंजीकृत करता है, SensorManager HAL (Hardware Abstraction Layer) — Linux कर्नेल स्तर पर चलने वाले निम्न-स्तरीय सेंसर ड्राइवर के साथ संचार करता है।
HAL ड्राइवर हार्डवेयर चिप से कच्चा डेटा प्राप्त करता है, शोर को फ़िल्टर करता है, और इसे स्टैक में ऊपर — SensorService (सिस्टम प्रक्रिया) के माध्यम से एप्लिकेशन तक पहुँचाता है। डेटा एक SensorEvent ऑब्जेक्ट के रूप में पास किया जाता है जिसमें float मानों की एक सरणी values और नैनोसेकंड में एक टाइमस्टैम्प होता है। इवेंट दर चयनित डिलीवरी मोड पर निर्भर करती है।
श्रोता पंजीकृत करते समय, डेवलपर कॉन्स्टेंट SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) और SENSOR_DELAY_FASTEST (0 ms — अधिकतम दर) का उपयोग करके इवेंट के बीच वांछित विलंब निर्दिष्ट करता है। वास्तविक दर भिन्न हो सकती है — सिस्टम बिजली की खपत को अनुकूलित करता है।
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
this,
sensor,
SensorManager.SENSOR_DELAY_GAME
)
Android 2.3 से शुरू करके, सेंसर बैच मोड का समर्थन करते हैं — इवेंट FIFO बफ़र में जमा होते हैं और एक बैच में वितरित किए जाते हैं। यह प्रोसेसर को स्लीप मोड में अधिक समय तक रहने देता है, जिससे बिजली की खपत 60% तक कम हो जाती है। बफ़र का आकार सेंसर चिप पर निर्भर करता है और Sensor.fifoMaxEventCount फ़ील्ड में निर्दिष्ट किया जाता है।
SensorManager एक सिस्टम सेवा है जो getSystemService(Context.SENSOR_SERVICE) के माध्यम से उपलब्ध है। यह सेंसर की सूची प्राप्त करने, एक विशिष्ट डिफ़ॉल्ट सेंसर प्राप्त करने और श्रोताओं को पंजीकृत/अपंजीकृत करने के तरीके प्रदान करता है। SensorManager एक सिंगलटन है — पूरे एप्लिकेशन के लिए एक इंस्टेंस।
सेंसर का उपयोग करने से पहले, आपको इसकी उपलब्धता की जाँच करनी चाहिए। getDefaultSensor(type) विधि null लौटाती है यदि सेंसर डिवाइस पर मौजूद नहीं है। बिना जाँच के null प्राप्त करना श्रोता पंजीकृत करते समय NullPointerException का कारण बनेगा। getSensorList(type) विधि सभी सेंसर की सूची लौटाती है।
fun checkSensorAvailability(type: Int): Boolean {
val sensorManager =
getSystemService(Context.SENSOR_SERVICE) as SensorManager
return sensorManager.getDefaultSensor(type) != null
}
// उपयोग:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
Log.d("सेंसर", "जायरोस्कोप उपलब्ध")
}
श्रोता registerListener(listener, sensor, delay) के माध्यम से पंजीकृत किया जाता है। महत्वपूर्ण: आपको onPause() विधि में unregisterListener(listener) के माध्यम से श्रोता को अपंजीकृत करना होगा। यदि ऐसा नहीं किया जाता है, तो एप्लिकेशन सेंसर इवेंट प्राप्त करना जारी रखेगा, जिससे बैकग्राउंड में भी बैटरी खत्म होगी। Android 8+ अपंजीकृत श्रोताओं के बारे में logcat में चेतावनी दिखाता है।
onAccuracyChanged(sensor, accuracy) विधि तब कॉल की जाती है जब सेंसर की सटीकता बदलती है। मान: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW और UNRELIABLE। UNRELIABLE प्राप्त करने पर, सटीकता बहाल होने तक सेंसर डेटा को अनदेखा किया जाना चाहिए। उदाहरण के लिए, मैग्नेटोमीटर को कैलिब्रेशन की आवश्यकता होती है — डिवाइस को आठ की आकृति में हिलाना।
आइए Kotlin के साथ Android एप्लिकेशन में Sensors API के उपयोग के व्यावहारिक उदाहरण देखें। पहला उदाहरण — एक्सीलरोमीटर का उपयोग करके स्क्रीन ओरिएंटेशन निर्धारित करना। दूसरा — कैलिब्रेशन के साथ मैग्नेटोमीटर डेटा पढ़ना। तीसरा — स्टेप काउंटर का उपयोग करके स्टेप डिटेक्टर।
ओरिएंटेशन निर्धारित करने के लिए एक्सीलरोमीटर और मैग्नेटोमीटर के संयोजन का उपयोग किया जाता है। SensorManager.getRotationMatrix() विधि रोटेशन मैट्रिक्स की गणना करती है, और getOrientation() pitch, roll और azimuth कोण निकालता है। Azimuth (अज़ीमुथ) — रेडियन में चुंबकीय उत्तर के सापेक्ष कोण।
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())
स्टेप काउंटर (TYPE_STEP_COUNTER) अंतिम डिवाइस रिबूट के बाद से उपयोगकर्ता द्वारा उठाए गए कदमों की कुल संख्या लौटाता है। सेंसर हार्डवेयर स्तर पर काम करता है — यह तब भी सक्रिय रहता है जब एप्लिकेशन नहीं चल रहा हो। प्रति सत्र कदम प्राप्त करने के लिए, आपको प्रारंभिक मान सहेजना और अंतर की गणना करनी होगी।
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("कदम", "प्रति सत्र कदम: $sessionSteps")
}
}
प्रकाश सेंसर पर्यावरणीय परिस्थितियों के अनुसार इंटरफ़ेस को अनुकूलित करने की अनुमति देता है। कम रोशनी में (10 lx से कम), आप डार्क मोड पर स्विच कर सकते हैं। तेज़ धूप में (10000 lx से अधिक), आप कंट्रास्ट बढ़ा सकते हैं। शोर फ़िल्टरिंग के लिए अंतिम 5 मानों का मूविंग एवरेज उपयोग किया जाता है।
Android कई वर्चुअल सेंसर प्रदान करता है जिनका कोई सीधा हार्डवेयर समकक्ष नहीं है। एक वर्चुअल सेंसर भौतिक सेंसर के संयोजन के आधार पर अपनी रीडिंग की गणना करता है। यह डेवलपर पर बोझ कम करता है — सिस्टम स्वयं डेटा फ़्यूज़न एल्गोरिदम लागू करता है।
Gravity (TYPE_GRAVITY) सेंसर लो-पास फ़िल्टर का उपयोग करके एक्सीलरोमीटर रीडिंग से गुरुत्वाकर्षण घटक निकालता है। Linear Acceleration (TYPE_LINEAR_ACCELERATION), इसके विपरीत, गुरुत्वाकर्षण को हटाता है और केवल डिवाइस के रैखिक त्वरण को छोड़ता है। Gravity और Linear Acceleration का योग कच्ची एक्सीलरोमीटर रीडिंग देता है।
Rotation Vector — सबसे जटिल वर्चुअल सेंसर। यह जायरोस्कोप (उच्च-आवृत्ति परिवर्तन), एक्सीलरोमीटर (गुरुत्वाकर्षण वेक्टर) और मैग्नेटोमीटर (उत्तर के सापेक्ष ओरिएंटेशन) से डेटा को जोड़ता है। परिणाम एक क्वाटरनियन है जो अंतरिक्ष में डिवाइस के पूर्ण ओरिएंटेशन का वर्णन करता है। इसका उपयोग AR एप्लिकेशन और VR हेडसेट में किया जाता है।
Game Rotation Vector — मैग्नेटोमीटर के उपयोग के बिना Rotation Vector का एक सरलीकृत संस्करण। यह कम अज़ीमुथ सटीकता देता है लेकिन उच्च अपडेट दर और स्थिरता देता है। यह गेम के लिए अनुशंसित है जहां उत्तर के सापेक्ष पूर्ण ओरिएंटेशन के बजाय कम विलंबता महत्वपूर्ण है।
सेंसर डिवाइस के सबसे अधिक बिजली की खपत करने वाले घटकों में से हैं। अधिकतम पोलिंग दर पर एक्सीलरोमीटर और जायरोस्कोप 3–4 घंटे के निरंतर संचालन में बैटरी खत्म कर सकते हैं। सेंसर उपयोग को अनुकूलित करना Sensors API का उपयोग करने वाले किसी भी एप्लिकेशन के लिए एक महत्वपूर्ण कार्य है।
बिना आवश्यकता के SENSOR_DELAY_FASTEST का उपयोग न करें। UI एनिमेशन के लिए, SENSOR_DELAY_UI (60 ms) पर्याप्त है। स्क्रीन ओरिएंटेशन डिटेक्शन के लिए — SENSOR_DELAY_NORMAL (200 ms)। दर जितनी अधिक होगी, प्रोसेसर उतना ही अधिक समय सक्रिय अवस्था में बिताता है। NORMAL और FASTEST के बीच बिजली की खपत में 10x तक का अंतर होता है।
Android 8.0 (API 26) से शुरू करके, बैकग्राउंड एप्लिकेशन कम दर पर सेंसर इवेंट प्राप्त करते हैं। Android 12+ में, Motion और Position सेंसर तक बैकग्राउंड पहुँच के लिए BODY_SENSORS_BACKGROUND अनुमति की आवश्यकता होती है। जब एप्लिकेशन बैकग्राउंड में जाता है तो श्रोता को अपंजीकृत करें — यह डिवाइस की बैटरी लाइफ बढ़ाता है।
registerListener(listener, sensor, delay, maxReportLatencyUs) विधि के माध्यम से बैच प्रोसेसिंग का उपयोग करें। maxReportLatencyUs पैरामीटर माइक्रोसेकंड में अधिकतम इवेंट डिलीवरी विलंबता सेट करता है। 1000000 (1 सेकंड) के मान के साथ, इवेंट सेंसर के FIFO बफ़र में जमा होते हैं और प्रति सेकंड एक बार वितरित किए जाते हैं — प्रोसेसर कम बार जागता है।
अक्सर पूछे जाने वाले प्रश्न
न्यूनतम सेट एक एक्सीलरोमीटर और मैग्नेटोमीटर है। ये दो सेंसर 95% से अधिक डिवाइस पर मौजूद हैं। जायरोस्कोप, प्रकाश सेंसर और प्रॉक्सिमिटी सेंसर — 70–80% आधुनिक मॉडलों पर। अन्य सेंसर (दबाव, तापमान, आर्द्रता, स्टेप काउंटर) कम आम हैं और डिवाइस की मूल्य श्रेणी पर निर्भर करते हैं।
TYPE_ACCELEROMETER गुरुत्वाकर्षण सहित पूर्ण त्वरण लौटाता है (9.8 m/s²)। TYPE_LINEAR_ACCELERATION गुरुत्वाकर्षण को छोड़कर त्वरण लौटाता है — केवल डिवाइस की गति का त्वरण। यदि डिवाइस स्थिर पड़ा है, तो एक्सीलरोमीटर Z अक्ष के साथ 9.8 m/s² दिखाएगा, जबकि Linear Acceleration सभी अक्षों पर 0 दिखाएगा।
उपयुक्त कॉन्स्टेंट के साथ getPackageManager().hasSystemFeature() का उपयोग करें: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY और अन्य। एक वैकल्पिक तरीका getDefaultSensor(type) को कॉल करना और null के लिए परिणाम की जाँच करना है। पहला तरीका इनिशियलाइज़ेशन के दौरान जाँच के लिए बेहतर है।
सेंसर से कच्चे डेटा में शोर होता है। स्मूथ करने के लिए, लो-पास फ़िल्टर का उपयोग करें: newValue = alpha * rawValue + (1 — alpha) * previousValue। 0.1–0.3 का alpha गुणांक प्रतिक्रिया और स्मूथनेस के बीच एक अच्छा संतुलन प्रदान करता है। जायरोस्कोप के लिए, शून्य ड्रिफ्ट को हटाने के लिए हाई-पास फ़िल्टर भी लागू किया जाता है।
हाँ, लेकिन सीमाओं के साथ। Android 8.0 से शुरू करके, बैकग्राउंड एप्लिकेशन के लिए सेंसर इवेंट दर कम हो जाती है। Android 12 से शुरू करके, बैकग्राउंड सेंसर एक्सेस के लिए BODY_SENSORS_BACKGROUND अनुमति की आवश्यकता होती है। बैकग्राउंड कार्य के लिए, नोटिफिकेशन के साथ Foreground Service का उपयोग करने की अनुशंसा की जाती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें