Sensors API ڈیوائس کے ہارڈویئر سینسر تک رسائی کے لیے Android پلیٹ فارم انٹرفیس ہے۔ API ایکسلرومیٹر، جائروسکوپ، میگنیٹو میٹر، لائٹ سینسر اور دیگر سینسر سے ڈیٹا حاصل کرنے کا یکساں طریقہ فراہم کرتا ہے۔ Google, 2026 کے مطابق، جدید Android ڈیوائسز کے 95% سے زیادہ کم از کم تین اقسام کے سینسر سے لیس ہیں، جو سیاق و سباق سے آگاہ ایپلیکیشنز تیار کرنے کے وسیع مواقع فراہم کرتا ہے۔
اہم نکات
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 (ہارڈویئر ایبسٹریکشن لیئر) — 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 — سب سے پیچیدہ ورچوئل سینسر۔ یہ جائروسکوپ (اعلی تعدد تبدیلیاں)، ایکسلرومیٹر (کشش ثقل ویکٹر) اور میگنیٹو میٹر (شمال کے نسبت سمت) سے ڈیٹا کو یکجا کرتا ہے۔ نتیجہ ایک quaternion ہے جو خلا میں ڈیوائس کی مطلق سمت کو بیان کرتا ہے۔ یہ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں