تحتوي معظم الأجهزة التي تعمل بنظام التشغيل Android على أدوات استشعار مدمجة تقيس الحركة والاتجاه والظروف البيئية المختلفة. يمكن لهذه الحساسات تقديم بيانات أولية بدقة عالية، وهي مفيدة إذا كنت تريد رصد حركة الجهاز أو تحديد موقعه الجغرافي في الاتجاهات الثلاث، أو إذا كنت تريد رصد التغيُّرات في البيئة المحيطة بالجهاز. على سبيل المثال، قد تتتبّع اللعبة القراءات من جهاز استشعار الجاذبية على الجهاز لاستنتاج إيماءات المستخدم المعقدة وحركات مثل الإمالة أو الاهتزاز أو التدوير أو التأرجح. وبالمثل، قد يستخدم تطبيق طقس جهاز استشعار الحرارة وجهاز استشعار الرطوبة في الجهاز لاحتساب نقطة الندى أو معدّل التنقّل أداة استشعار المجال المغناطيسي الأرضي ومقياس التسارع للإبلاغ عن بوصلة تحمل.
يمكنك الاطّلاع على المراجع التالية ذات الصلة:
يتوافق نظام Android الأساسي مع ثلاث فئات واسعة من أدوات الاستشعار:
- أجهزة استشعار الحركة
تقيس هذه الحساسات قوى التسارع وقوى الدوران على طول ثلاثة محاور. تشمل هذه الفئة مقاييس التسارع وأدوات استشعار الجاذبية والجيروسكوبات وأدوات استشعار المتّجهات الدوّارة.
- أدوات الاستشعار البيئية
تقيس هذه الحساسات المَعلمات البيئية المختلفة، مثل درجة حرارة الهواء المحيط والضغط والإضاءة والرطوبة. تشمل هذه الفئة مقاييس الضغط الجوي وأجهزة قياس الإضاءة ومقاييس حرارة الغرفة.
- أجهزة استشعار الموضع
تقيس أجهزة الاستشعار هذه الموضع المادي للجهاز. تتضمن هذه الفئة وأجهزة استشعار الاتجاه ومقياس المغناطيسية.
يمكنك الوصول إلى أجهزة الاستشعار المتاحة على الجهاز والحصول على بياناتها الأولية باستخدام إطار عمل أجهزة الاستشعار في Android. يوفّر إطار عمل الاستشعار العديد من الفئات والواجهات التي تساعدك في تنفيذ مجموعة كبيرة من المهام المتعلّقة بأجهزة الاستشعار. على سبيل المثال، يمكنك استخدام إطار عمل أداة الاستشعار لإجراء ما يلي:
- يمكنك تحديد أدوات الاستشعار المتوفرة على الجهاز.
- تحديد قدرات جهاز استشعار فردي، مثل أقصى نطاق له والشركة المصنّعة والطاقة ومتطلباته والحل.
- يمكنك الحصول على بيانات الاستشعار الأوّلية وتحديد الحدّ الأدنى لمعدّل الحصول على بيانات الاستشعار.
- تسجيل أدوات معالجة أحداث أجهزة الاستشعار التي ترصد تغييرات أجهزة الاستشعار وإلغاء تسجيلها
يقدّم هذا الموضوع نظرة عامة على أدوات الاستشعار المتوفرة على نظام Android الأساسي. ويقدّم أيضًا مقدّمة عن إطار عمل أداة الاستشعار.
مقدمة عن أجهزة الاستشعار
يتيح لك إطار عمل أداة استشعار Android الوصول إلى العديد من أنواع أدوات الاستشعار. تعتمد بعض هذه الحساسات على الأجهزة، في حين تعتمد بعضها الآخر على البرامج. المستشعرات المستندة إلى الأجهزة هي مكونات مادية يتم إنشاؤها إلى هاتف محمول أو جهاز لوحي. فهي تستخرج بياناتها عن طريق القياس المباشر للبيئة مثل التسارع أو قوة المجال المغناطيسي الأرضي أو التغير الزاوي. مستندة إلى البرامج أجهزة الاستشعار ليست أجهزة مادية، على الرغم من أنها تحاكي أدوات استشعار تستند إلى الأجهزة. تحصل أجهزة الاستشعار المستندة إلى البرامج على بياناتها من جهاز استشعار واحد أو أكثر من أجهزة الاستشعار المستندة إلى الأجهزة، ويُطلق عليها أحيانًا اسم أجهزة استشعار افتراضية أو أجهزة استشعار اصطناعية. ومن الأمثلة على ذلك مستشعر التسارع الخطي ومستشعر الجاذبية أجهزة الاستشعار المستندة إلى البرامج. يلخّص الجدول 1 أدوات الاستشعار المتوافقة مع نظام التشغيل Android بدون خادم.
لا تتضمّن بعض أجهزة Android كل أنواع أدوات الاستشعار. على سبيل المثال، تسمح معظم أجهزة الهاتف فالأجهزة اللوحية تحتوي على مقياس تسارع ومقياس مغناطيسية، ولكن في عدد قليل من الأجهزة مقاييس البارومترات أو موازين الحرارة يمكن أن يحتوي الجهاز أيضًا على أكثر من أداة استشعار من نوع معيّن. بالنسبة على سبيل المثال، يمكن أن يحتوي الجهاز على اثنين من أجهزة استشعار الجاذبية، ولكل منهما نطاق مختلف.
الجدول 1: أنواع أجهزة الاستشعار المتوافقة مع نظام Android الأساسي
أداة استشعار | النوع | الوصف | الاستخدامات الشائعة |
---|---|---|---|
TYPE_ACCELEROMETER |
الأجهزة | يقيس هذا المقياس قوة التسارع بوحدة متر في الثانية2 التي يتم تطبيقها على جهاز على جميع المحاور الثلاثة (x وy وz)، بما في ذلك قوة الجاذبية. | كشف الحركة (الاهتزاز والإمالة وما إلى ذلك) |
TYPE_AMBIENT_TEMPERATURE |
الأجهزة | يقيس درجة الحرارة المحيطة في الغرفة بالدرجة المئوية (°C). انظر الملاحظة أدناه. | تتم مراقبة درجات حرارة الهواء. |
TYPE_GRAVITY |
البرامج أو الأجهزة | تقيس قوة الجاذبية بوحدة m/s2 التي يتم تطبيقها على جهاز على كل المحاور الثلاثة (x وy وz). | كشف الحركة (الاهتزاز والإمالة وما إلى ذلك) |
TYPE_GYROSCOPE |
الأجهزة | يقيس معدّل دوران الجهاز بالراديان في الثانية حول كلّ من الثلاثة محاور المادية (x وy وz). | اكتشاف التدوير (دوران، دوران، إلخ.). |
TYPE_LIGHT |
الأجهزة | يقيس مستوى الإضاءة المحيطة (الإضاءة) بالوحدة Lx. | التحكّم في سطوع الشاشة |
TYPE_LINEAR_ACCELERATION |
البرامج أو الأجهزة | يقيس هذا المقياس قوة التسارع بوحدة متر في الثانية2 التي يتم تطبيقها على جهاز على جميع المحاور الثلاثة (x وy وz)، باستثناء قوة الجاذبية. | رصد التسارع على محور واحد. |
TYPE_MAGNETIC_FIELD |
الأجهزة | يقيس المجال المغناطيسي المحيطي لجميع المحاور المادية الثلاثة (س، ص، ع) في ميكرو تي | إنشاء بوصلة |
TYPE_ORIENTATION |
البرامج | يقيس درجات الدوران التي يقوم بها الجهاز حول جميع المحاور المادية الثلاثة (س، ص، ع).
ومع المستوى 3 من واجهة برمجة التطبيقات، يمكنك الحصول على مصفوفة الميل ومصفوفة تدوير
أحد الأجهزة عن طريق استخدام مستشعر الجاذبية ومستشعر المجال المغناطيسي للأرض مع
getRotationMatrix()
. |
جارٍ تحديد موضع الجهاز. |
TYPE_PRESSURE |
الأجهزة | تقيس هذه القيمة ضغط الهواء المحيط بالوحدة hPa أو mbar. | مراقبة التغيُّرات في ضغط الهواء |
TYPE_PROXIMITY |
الأجهزة | تقيس هذه السمة مدى قرب جسم معيّن بالسنتيمترات من شاشة العرض في الجهاز. يُستخدَم هذا المستشعر عادةً لتحديد ما إذا كان الهاتف الجوّال مُمسكًا به عند أذن المستخدم. | موضع الهاتف أثناء المكالمة |
TYPE_RELATIVE_HUMIDITY |
الأجهزة | يقيس الرطوبة النسبية للبيئة المحيطة بالمقياس المئوي (%). | مراقبة نقطة الندى والرطوبة المطلقة والنسبية |
TYPE_ROTATION_VECTOR |
البرامج أو الأجهزة | تقيس اتجاه الجهاز من خلال توفير العناصر الثلاثة لمتجه دوران الجهاز. | رصد الحركة ورصد الدوران |
TYPE_TEMPERATURE |
الأجهزة | يقيس درجة حرارة الجهاز بالدرجة المئوية. جهاز الاستشعار هذا
يختلف تنفيذها عبر الأجهزة
تم استبدال جهاز الاستشعار هذا بأداة الاستشعار TYPE_AMBIENT_TEMPERATURE في
المستوى 14 من واجهة برمجة التطبيقات |
جارٍ مراقبة درجات الحرارة. |
إطار عمل المستشعر
يمكنك الوصول إلى أدوات الاستشعار هذه والحصول على بياناتها الأولية بالمستشعر باستخدام إطار عمل أداة استشعار Android.
يشكّل إطار عمل أداة الاستشعار جزءًا من حزمة "android.hardware
" ويتضمّن ما يلي:
الفئات والواجهات:
SensorManager
- يمكنك استخدام هذه الفئة لإنشاء مثيل لخدمة الاستشعار. يوفر هذا الفصل طرق مختلفة للوصول إلى أجهزة الاستشعار وإدراجها، وتسجيل أحداث المستشعر وإلغاء تسجيلها والمستمعين والحصول على معلومات التوجيه. توفر هذه الفئة أيضًا العديد من ثوابت أداة الاستشعار التي تُستخدَم للإبلاغ عن دقة أداة الاستشعار وضبط معدّلات الحصول على البيانات ومعايرة أجهزة الاستشعار.
Sensor
- يمكنك استخدام هذه الفئة لإنشاء مثيل لجهاز استشعار معيّن. تقدّم هذه الفئة METHODS مختلفة تتيح لك تحديد إمكانات أداة الاستشعار.
SensorEvent
- يستخدم النظام هذه الفئة لإنشاء عنصر حدث جهاز استشعار، والذي يقدّم معلومات عن حدث جهاز الاستشعار. يتضمن كائن حدث المستشعر المعلومات التالية: بيانات جهاز الاستشعار الأولية نوع أداة الاستشعار التي أدت إلى إنشاء الحدث ودقة البيانات والطابع الزمني فعالية .
SensorEventListener
- يمكنك استخدام هذه الواجهة لإنشاء طريقتَي ردّ اتصال تتلقّيان الإشعارات (أحداث الاستشعار) عند تغيُّر قيم الاستشعار أو عند تغيُّر دقة الاستشعار.
في التطبيقات النموذجية، تستخدم واجهات برمجة التطبيقات المتعلقة بالمستشعرات هذه لأداء مهمتين أساسيتين:
- التعرّف على أجهزة الاستشعار وإمكاناتها
من المفيد تحديد أدوات الاستشعار وإمكاناتها أثناء التشغيل إذا كان تطبيقك يحتوي على ميزات تعتمد على أنواع أدوات استشعار أو إمكانات معيّنة. على سبيل المثال، قد ترغب في التعرّف على جميع أدوات الاستشعار المتوفرة على الجهاز وإيقاف أي ميزات من ميزات التطبيقات التي تعتمد على أدوات استشعار غير موجودة وبالمثل، قد تحتاج إلى التعرّف على جميع أدوات الاستشعار من أي نوع محدَّد حتى يمكنك اختيار أداة الاستشعار التي تحقق الأداء الأمثل على تطبيقك.
- مراقبة أحداث أجهزة الاستشعار
تتيح لك مراقبة أحداث أجهزة الاستشعار الحصول على بيانات أجهزة الاستشعار الأوّلية. يحدث حدث استشعار في كل مرة يرصد جهاز الاستشعار تغييرًا في المعاملات التي يقيسها. يوفّر لك حدث الاستشعار أربع معلومات: اسم أداة الاستشعار التي تسبّبت في الحدث، والطابع الزمني للحدث، ودقّة الحدث، وبيانات أداة الاستشعار الأوّلية التي تسبّبت في الحدث.
مدى توفّر أداة الاستشعار
يختلف مدى توفّر أداة الاستشعار من جهاز إلى آخر، وقد يختلف أيضًا بين إصدارات Android . والسبب هو أنّ "أدوات استشعار Android" تم تقديمها على مدار عدة إصدارات المنصة. على سبيل المثال، تمّ تقديم العديد من أدوات الاستشعار في Android 1.5 (المستوى 3 لواجهة برمجة التطبيقات)، ولكن تم تقديم بعض أدوات الاستشعار لم يتم تنفيذها ولم تكن متاحة للاستخدام حتى Android 2.3 (مستوى واجهة برمجة التطبيقات 9). وبالمثل، تم تقديم العديد من أدوات الاستشعار في Android 2.3 (المستوى 9 لواجهة برمجة التطبيقات) وAndroid 4.0 (المستوى 14 لواجهة برمجة التطبيقات). قطعتان تم إيقاف أجهزة الاستشعار واستبدالها بأجهزة استشعار أحدث ومحسّنة.
يلخّص الجدول 2 مدى توفّر كل جهاز استشعار على أساس كلّ منصة على حدة. تم إدراج أربعة منصّات فقط لأنّها المنصّات التي تتضمّن تغييرات في أجهزة الاستشعار. إنّ أدوات الاستشعار التي تم إدراجها على أنّها متوقّفة نهائيًا لا تزال متاحة على الأنظمة الأساسية اللاحقة (شرط أن تكون أدوات الاستشعار متوفّرة على أحد الأجهزة)، وذلك بما يتوافق مع سياسة التوافق المستقبلي في Android.
الجدول 2. مدى توفّر أجهزة الاستشعار حسب المنصة
أداة استشعار | الإصدار 4.0 من نظام التشغيل Android (المستوى 14 لواجهة برمجة التطبيقات) |
Android 2.3 (المستوى 9 من واجهة برمجة التطبيقات) |
الإصدار 2.2 من نظام التشغيل Android (المستوى 8 لواجهة برمجة التطبيقات) |
الإصدار 1.5 من نظام التشغيل Android (المستوى 3 لواجهة برمجة التطبيقات) |
---|---|---|---|---|
TYPE_ACCELEROMETER |
نعم | نعم | نعم | نعم |
TYPE_AMBIENT_TEMPERATURE |
نعم | لا تنطبق | لا تنطبق | لا تنطبق |
TYPE_GRAVITY |
نعم | نعم | لا تنطبق | لا تنطبق |
TYPE_GYROSCOPE |
نعم | نعم | لا تنطبق1 | لا تنطبق1 |
TYPE_LIGHT |
نعم | نعم | نعم | نعم |
TYPE_LINEAR_ACCELERATION |
نعم | نعم | لا تنطبق | لا تنطبق |
TYPE_MAGNETIC_FIELD |
نعم | نعم | نعم | نعم |
TYPE_ORIENTATION |
نعم2 | نعم2 | نعم2 | نعم |
TYPE_PRESSURE |
نعم | نعم | لا تنطبق1 | لا تنطبق1 |
TYPE_PROXIMITY |
نعم | نعم | نعم | نعم |
TYPE_RELATIVE_HUMIDITY |
نعم | لا تنطبق | لا تنطبق | لا تنطبق |
TYPE_ROTATION_VECTOR |
نعم | نعم | لا تنطبق | لا تنطبق |
TYPE_TEMPERATURE |
نعم2 | نعم | نعم | نعم |
1 تمت إضافة نوع أداة الاستشعار هذا في Android 1.5 (المستوى 3 لواجهة برمجة التطبيقات)، ولكنه لم يكن متاحًا للاستخدام حتى Android 2.3 (المستوى 9 لواجهة برمجة التطبيقات).
2 يتوفَّر جهاز الاستشعار هذا، لكنه لا يزال متاحًا. نهائيًا.
التعرّف على أجهزة الاستشعار وإمكانياتها
يوفّر إطار عمل أداة استشعار Android العديد من الطرق التي تسهّل عليك تحديد وقت التشغيل وأدوات الاستشعار على الجهاز. توفّر واجهة برمجة التطبيقات أيضًا طرقًا تتيح لك تحديد إمكانات كل جهاز استشعار، مثل أقصى نطاق له ودقته وقوته متطلبات المشروع.
لتحديد المستشعرات الموجودة على أحد الأجهزة، يجب أولاً الرجوع إلى أداة الاستشعار
خدمة ما. ولإجراء ذلك، عليك إنشاء مثيل لفئة SensorManager
حسب
عن طريق استدعاء طريقة getSystemService()
وتمرير
في الوسيطة SENSOR_SERVICE
. مثلاً:
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
بعد ذلك، يمكنك الحصول على قائمة بكل أجهزة الاستشعار على الجهاز من خلال استدعاء الطريقة
getSensorList()
واستخدام الثابت TYPE_ALL
. مثلاً:
val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
إذا كنت تريد إدراج جميع أجهزة الاستشعار من نوع معيّن، يمكنك استخدام ثابت آخر بدلاً من
TYPE_ALL
مثل TYPE_GYROSCOPE
أو
TYPE_LINEAR_ACCELERATION
أو
TYPE_GRAVITY
.
يمكنك أيضًا تحديد ما إذا كان الجهاز نوعًا معيّنًا من أدوات الاستشعار متاحًا من خلال طريقة getDefaultSensor()
وتحديد النوع.
ثابت لمستشعر معين. إذا كان الجهاز يحتوي على أكثر من أداة استشعار واحدة من نوع معيّن، يجب تحديد إحدى
الأدوات على أنّها أداة الاستشعار التلقائية. إذا لم يتم العثور على جهاز استشعار افتراضي
نوع جهاز استشعار، يكون ناتج استدعاء الطريقة قيمة خالية، مما يعني أن الجهاز لا يحتوي على هذا النوع
أداة الاستشعار. على سبيل المثال، تتحقّق التعليمة البرمجية التالية مما إذا كان هناك مقياس مغناطيسي على الجهاز:
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) { // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
ملاحظة: لا يطلب نظام التشغيل Android من المصنّعين تضمين أي أنواع معيّنة من أجهزة الاستشعار في أجهزتهم التي تعمل بنظام التشغيل Android، لذا يمكن أن تتضمّن الأجهزة مجموعة كبيرة من إعدادات أجهزة الاستشعار.
وبالإضافة إلى عرض بيانات أجهزة الاستشعار الموجودة على الجهاز، يمكنك أيضًا الاستعانة بالأساليب العامة
Sensor
لتحديد إمكانات وسمات كل فرد
أجهزة الاستشعار. ويكون هذا مفيدًا إذا كنت تريد أن يعمل التطبيق بشكل مختلف استنادًا إلى أدوات الاستشعار أو
جميع إمكانات جهاز الاستشعار على أحد الأجهزة. على سبيل المثال، يمكنك استخدام الطريقتَين getResolution()
وgetMaximumRange()
للحصول على درجة دقة أداة الاستشعار والحد الأقصى لنطاق القياس. يمكنك أيضًا استخدام طريقة
getPower()
للحصول على متطلبات الطاقة الخاصة بجهاز الاستشعار.
تكون طريقتان من الطريقتَين المتاحتَين للجميع مفيدة بشكل خاص إذا كنت تريد تحسين تطبيقك ليعمل مع
أجهزة استشعار من جهات تصنيع مختلفة أو إصدارات مختلفة من جهاز استشعار. على سبيل المثال، إذا كان تطبيقك يحتاج إلى رصد إيماءات المستخدم، مثل الميل والاهتزاز، يمكنك إنشاء مجموعة واحدة من قواعد تحسين وتصفية البيانات للأجهزة الأحدث التي تحتوي على أداة استشعار الجاذبية الخاصة بمورّد معيّن، ومجموعة أخرى من قواعد تحسين وتصفية البيانات للأجهزة التي لا تحتوي على أداة استشعار الجاذبية وتحتوي على أداة تسارع فقط. يعرض لك نموذج الرمز البرمجي التالي كيفية استخدام طريقتَي getVendor()
وgetVersion()
لتنفيذ الإجراءات المطلوبة.
هذا. في هذه العينة، نبحث عن جهاز استشعار للجاذبية يُدرج Google LLC كمورّد
رقم الإصدار 3. إذا لم يكن جهاز الاستشعار هذا متوفّرًا على الجهاز، نحاول استخدام
المقياس التسارعي.
private lateinit var sensorManager: SensorManager private var mSensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) { val gravSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_GRAVITY) // Use the version 3 gravity sensor. mSensor = gravSensors.firstOrNull { it.vendor.contains("Google LLC") && it.version == 3 } } if (mSensor == null) { // Use the accelerometer. mSensor = if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) } else { // Sorry, there are no accelerometers on your device. // You can't play this game. null } }
private SensorManager sensorManager; private Sensor mSensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = null; if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List<Sensor> gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY); for(int i=0; i<gravSensors.size(); i++) { if ((gravSensors.get(i).getVendor().contains("Google LLC")) && (gravSensors.get(i).getVersion() == 3)){ // Use the version 3 gravity sensor. mSensor = gravSensors.get(i); } } } if (mSensor == null){ // Use the accelerometer. if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } else{ // Sorry, there are no accelerometers on your device. // You can't play this game. } }
هناك طريقة أخرى مفيدة وهي getMinDelay()
،
من خلال عرض الحد الأدنى للفاصل الزمني (بالميكرو ثانية) التي يمكن لأداة الاستشعار استخدامها لاستشعار البيانات. أي أداة استشعار
التي تُرجع قيمة غير صفرية للسمة getMinDelay()
طريقة البث
أداة الاستشعار. تستشعر أدوات استشعار البث البيانات على فترات زمنية منتظمة وتم توفيرها في Android 2.3 (واجهة برمجة التطبيقات
المستوى 9). إذا كان ناتج جهاز الاستشعار صفرًا عند طلب طريقة getMinDelay()
، هذا يعني أنّ قيمة
لا تُعدّ أداة الاستشعار من أجهزة استشعار البث لأنّها لا تُبلغ عن البيانات إلّا عند حدوث تغيير في
المعاملات التي يتم استشعارها.
ويكون استخدام الطريقة getMinDelay()
مفيدًا لأنها تتيح
أنت تحدد الحد الأقصى لمعدل
التي يمكن للمستشعر من خلالها الحصول على البيانات. إذا كانت ميزات معيّنة في تطبيقك تتطلّب معدلات عالية لجمع البيانات أو أداة استشعار للبث، يمكنك استخدام هذه الطريقة لتحديد ما إذا كانت أداة الاستشعار تلبي هذه المتطلبات، ثم تفعيل الميزات ذات الصلة في تطبيقك أو إيقافها تبعًا لذلك.
تنبيه: لا يتم تطبيق الحد الأقصى لمعدّل اكتساب البيانات على أي جهاز استشعار معدّل تقديم إطار عمل أداة الاستشعار لبيانات الاستشعار إلى التطبيق. تشير رسالة الأشكال البيانية يقوم جهاز الاستشعار بالإبلاغ عن البيانات من خلال أحداث جهاز الاستشعار، وتؤثر العديد من العوامل في المعدل عندما يتلقى تطبيقك أحداث المستشعر. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة مراقبة أحداث أجهزة الاستشعار.
مراقبة أحداث أجهزة الاستشعار
لرصد بيانات جهاز الاستشعار الأولية، عليك تنفيذ طريقتَين لمعاودة الاتصال يتم الكشف عنهما من خلال
الواجهة SensorEventListener
: onAccuracyChanged()
وonSensorChanged()
. يستدعي نظام Android
هذه الطرق عند حدوث ما يلي:
- تتغيّر دقة أداة الاستشعار.
في هذه الحالة، يستدعي النظام طريقة
onAccuracyChanged()
، ما يمنحك مرجعًا إلى عنصرSensor
الذي تغيّر و الدقة الجديدة لجهاز الاستشعار. تُمثل الدقة بأحد ثوابت الحالة الأربعة:SENSOR_STATUS_ACCURACY_LOW
,SENSOR_STATUS_ACCURACY_MEDIUM
,SENSOR_STATUS_ACCURACY_HIGH
, أوSENSOR_STATUS_UNRELIABLE
. - تعرض أداة الاستشعار قيمة جديدة.
في هذه الحالة، يستدعي النظام طريقة
onSensorChanged()
، ما يوفّر لك كائنSensorEvent
. كائنSensorEvent
يحتوي على معلومات عن بيانات أداة الاستشعار الجديدة، بما في ذلك: دقة البيانات أداة الاستشعار التي تنشئ البيانات والطابع الزمني الذي تم إنشاء البيانات فيه البيانات التي سجّلها جهاز الاستشعار.
يوضح الرمز التالي كيفية استخدام طريقة onSensorChanged()
لمراقبة البيانات من
مستشعر الضوء. يعرض هذا المثال بيانات جهاز الاستشعار الأولية في TextView
.
أي
المحدد في ملفMain.xml كـ sensor_data
.
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var mLight: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. val lux = event.values[0] // Do something with this sensor value. } override fun onResume() { super.onResume() mLight?.also { light -> sensorManager.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL) } } override fun onPause() { super.onPause() sensorManager.unregisterListener(this) } }
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor mLight; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. float lux = event.values[0]; // Do something with this sensor value. } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } }
في هذا المثال، يتم تحديد مهلة البيانات التلقائية (SENSOR_DELAY_NORMAL
) عند استدعاء الطريقة registerListener()
. البيانات
مهلة (أو معدل أخذ العينات) للتحكم في الفاصل الزمني الذي يتم خلاله إرسال أحداث أداة الاستشعار إلى تطبيقك.
من خلال طريقة معاودة الاتصال onSensorChanged()
. الإعداد التلقائي
يُعد تأخير البيانات مناسبًا لمراقبة
يتغير اتجاه الشاشة النموذجي مع تأخير يبلغ 200000 ميكرو ثانية. يمكنك تحديد تأخُّرات data
أخرى، مثل SENSOR_DELAY_GAME
(تأخُّر 20,000
ميكرو ثانية) أو SENSOR_DELAY_UI
(تأخُّر 60,000
ميكرو ثانية) أو SENSOR_DELAY_FASTEST
(تأخُّر 0 ميكرو ثانية). بدءًا من Android 3.0 (واجهة برمجة التطبيقات
المستوى 11) يمكنك أيضًا تحديد التأخير كقيمة مطلقة (بالميكرو ثانية).
إنّ المهلة التي تحدّدها هي مهلة مقترَحة فقط. يمكن لنظام Android والتطبيقات الأخرى تغيير هذا التأخير. من أفضل الممارسات تحديد أكبر تأخير ممكن لأنّه يستخدم النظام عادةً تأخيرًا أقصر من الذي تحدّده (أي يجب اختيار أبطأ معدّل أخذ عينات لا يزال يستوفي احتياجات تطبيقك). يؤدي استخدام تأخير أكبر إلى خفض عبء العمل على المعالج وبالتالي استخدام طاقة أقل.
لا تتوفّر طريقة عامة لتحديد معدّل إرسال إطار عمل أداة الاستشعار لأحداث أداة الاستشعار إلى تطبيقك، ولكن يمكنك استخدام الطوابع الزمنية المرتبطة بكل حدث أداة استشعار لاحتساب معدّل أخذ العينات على مدار عدّة أحداث. لا ينبغي أن تضطر إلى تغيير معدل أخذ العينات (التأخير) بمجرد تعيينه. إذا كنت بحاجة إلى تغيير وقت الاستجابة لأي سبب، عليك إلغاء تسجيل مستمع الاستشعار وإعادة تسجيله.
من المهم أيضًا ملاحظة أن هذا المثال يستخدم onResume()
onPause()
طريقة لمعاودة الاتصال لتسجيل حدث أداة الاستشعار وإلغاء تسجيله
المستمع. من أفضل الممارسات إيقاف المستشعرات التي لا تحتاج إليها دائمًا، خاصةً عند إيقاف
نشاطك مؤقتًا. يمكن أن يؤدي عدم تنفيذ ذلك إلى استهلاك البطارية خلال بضع ساعات فقط لأنّ بعض أدوات الاستشعار
متطلبات طاقة كبيرة ويمكنها استهلاك طاقة البطارية بسرعة. النظام
لن يتم إيقاف أجهزة الاستشعار تلقائيًا عند إطفاء الشاشة.
التعامل مع الإعدادات المختلفة لأجهزة الاستشعار
لا يحدّد نظام التشغيل Android إعدادات قياسية للأجهزة، ما يعني أنّه يمكن لصنّاع الأجهزة دمج أي إعدادات قياسية للأجهزة يريدونها في أجهزتهم التي تعمل بنظام التشغيل Android. نتيجةً لذلك، يمكن أن تتضمن الأجهزة مجموعة متنوعة من أجهزة الاستشعار في مجموعة كبيرة من الإعدادات. إذا كان تطبيقك يعتمد على نوع معيّن من أدوات الاستشعار، عليك التأكّد من توفّر أدوات الاستشعار على الجهاز كي يتمكّن تطبيقك من العمل بنجاح.
أمامك خياران لضمان توفّر جهاز استشعار معيّن على أحد الأجهزة:
- رصد أجهزة الاستشعار أثناء التشغيل وتفعيل ميزات التطبيق أو إيقافها حسب الاقتضاء
- استخدِم فلاتر Google Play لاستهداف الأجهزة التي تتضمّن إعدادات محدّدة لأجهزة الاستشعار.
وتتم مناقشة كل خيار في الأقسام التالية.
رصد أدوات الاستشعار في وقت التشغيل
إذا كان تطبيقك يستخدم نوعًا معيّنًا من أدوات الاستشعار، ولكنّه لا يعتمد عليها، يمكنك استخدام إطار عمل أداة الاستشعار لرصد أداة الاستشعار أثناء التشغيل، ثم إيقاف ميزات التطبيق أو تفعيلها حسب الاقتضاء. على سبيل المثال، قد يستخدم تطبيق التنقّل أداة استشعار الحرارة وأداة استشعار الضغط وأداة استشعار نظام تحديد المواقع العالمي (GPS) وأداة استشعار الحقل المغناطيسي الأرضي لعرض درجة الحرارة والضغط الجوي والموقع الجغرافي واتجاه البوصلة. إذا كان الجهاز لا يتضمن مستشعرًا للضغط، يمكنك استخدام أداة استشعار الضغط لاكتشاف غياب مستشعر الضغط في وقت التشغيل ثم إيقاف جزء من واجهة مستخدم التطبيق يعرض الضغط. على سبيل المثال، يتم التحقق من التعليمة البرمجية التالية وجود جهاز استشعار ضغط على الجهاز:
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) { // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){ // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }
استخدام فلاتر Google Play لاستهداف إعدادات محدّدة لأجهزة الاستشعار
إذا كنت بصدد نشر تطبيقك على Google Play، يمكنك استخدام العنصر
<uses-feature>
في ملف البيان لفلترة تطبيقك من الأجهزة التي لا تملك
إعدادات أداة الاستشعار المناسبة لتطبيقك. تشير رسالة الأشكال البيانية
يحتوي عنصر <uses-feature>
على العديد من أدوات الوصف للأجهزة التي تتيح لك الفلترة.
التطبيقات القائمة على وجود أجهزة استشعار محددة. تشمل أدوات الاستشعار التي يمكنك إدراجها ما يلي:
مقياس التسارع، ومقياس الضغط الجوي، والبوصلة (المجال الجغرافي المغناطيسي)، والجيروسكوب، والضوء، والتقارب. تشير رسالة الأشكال البيانية
في ما يلي مثال على إدخال في البيان يفلتر التطبيقات التي لا تتضمّن مقياس تسارع:
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
في حال إضافة هذا العنصر والوصف إلى بيان تطبيقك، لن يظهر تطبيقك للمستخدمين على Google Play إلا إذا كان جهازهم مزوّدًا بمقياس تسارع.
يجب ضبط الوصف على android:required="true"
فقط إذا كان تطبيقك
يعتمد بالكامل على أداة استشعار معيّنة. إذا كان تطبيقك يستخدم أداة استشعار لبعض الوظائف، ولكنه
يظل يعمل بدون أداة الاستشعار، يجب إدراج أداة الاستشعار في العنصر <uses-feature>
، ولكن يجب ضبط الوصف على android:required="false"
. يساعد ذلك في ضمان أنّه
يمكن للأجهزة تثبيت تطبيقك حتى إذا لم تكن مزوّدة بجهاز الاستشعار هذا. هذه أيضًا
أفضل ممارسات إدارة المشروعات التي تساعدك في تتبع الميزات التي يستخدمها تطبيقك.
يُرجى العِلم أنّه إذا كان تطبيقك يستخدم أداة استشعار معيّنة، ولكنه لا يزال يعمل بدونها،
عليك رصد أداة الاستشعار أثناء التشغيل وإيقاف ميزات التطبيق أو تفعيلها
حسب الحاجة.
نظام إحداثيات أداة الاستشعار
بشكل عام، يستخدم إطار عمل أداة الاستشعار نظام إحداثيات عاديًا من 3 محاور للتعبير عن قيم البيانات. بالنسبة إلى معظم أدوات الاستشعار، يتم تحديد نظام الإحداثيات بالنسبة إلى شاشة الجهاز عندما يكون الجهاز في اتجاهه الافتراضي (انظر الشكل 1). عند حمل الجهاز في الاتجاه التلقائي، يكون محور X عموديًا ويشير إلى اليمين، ويكون محور Y عموديًا ويشير إلى الأعلى، ويشير محور Z إلى خارج شاشة الجهاز. في هذا النظام، تكون الإحداثيات التي تقع خلف الشاشة لها قيم سلبية لسمة Z. وتستخدم المستشعرات التالية نظام الإحداثيات هذا:

الشكل 1. نظام التنسيق (بالنسبة إلى الجهاز) الذي تستخدمه أداة الاستشعار واجهة برمجة التطبيقات.
- التسريع أداة الاستشعار
- الجاذبية أداة الاستشعار
- الجيروسكوب
- التسريع الخطي أداة الاستشعار
- مستشعر المجال المغناطيسي الأرضي
أهم نقطة يجب فهمها عن نظام الإحداثيات هذا هي أنّه لا يتم مبادلة المحاور عند تغيُّر اتجاه شاشة الجهاز، أي أنّ نظام إحداثيات أداة الاستشعار لا يتغيّر أبدًا أثناء تحرُّك الجهاز. وهذا السلوك هو نفسه سلوك نظام إحداثيات OpenGL .
وهناك نقطة أخرى يجب إدراكها وهي أن التطبيق يجب ألا يفترض أن يكون الجهاز الاتجاه (الافتراضي) هو رأسي. يعد الاتجاه الطبيعي للعديد من الأجهزة اللوحية أفقيًا. و فإن نظام إحداثيات أداة الاستشعار يعتمد دائمًا على الاتجاه الطبيعي للجهاز.
أخيرًا، إذا كان تطبيقك يطابق بيانات أداة الاستشعار مع الشاشة المعروضة، عليك استخدام الأسلوب
getRotation()
لتحديد دوران الشاشة، ثم استخدام الأسلوب
remapCoordinateSystem()
لربط
إحداثيات أداة الاستشعار بإحداثيات الشاشة. وعليك إجراء ذلك حتى إذا كان بيان التطبيق يحدّد
عرضًا بالوضع العمودي فقط.
ملاحظة: تستخدِم بعض الحساسات والأساليب نظام إحداثيات
نسبيًا إلى إطار مرجعي عالمي (على عكس إطار مرجعي الجهاز). تعرض هذه
الأدوات وطرق الاستشعار بيانات تمثّل حركة الجهاز أو موقعه بالنسبة إلى
الأرض. لمزيد من المعلومات، اطّلِع على طريقة getOrientation()
وطريقة getRotationMatrix()
ومستشعر اتجاه
ومستشعر متجه الدوران
.
الحدّ من معدّل إرسال البيانات من أجهزة الاستشعار
لحماية المعلومات التي يُحتمل أن تكون حسّاسة عن المستخدمين، إذا كان تطبيقك يستهدف في Android 12 (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يفرض النظام حدًا على عملية إعادة التحميل. معدل البيانات الواردة من بعض مستشعرات الحركة وأجهزة استشعار الموضع. وتشمل هذه البيانات القيم التي يسجّلها مقياس التسارع و الجيروسكوب و جهاز استشعار الحقل المغناطيسي الجغرافي في الجهاز.
يعتمد الحدّ الأقصى لمعدّل التحديث على طريقة وصولك إلى بيانات جهاز الاستشعار:
- إذا قمت باستدعاء دالة الرسم
registerListener()
مراقبة أحداث المستشعر، يكون معدل أخذ العينات من جهاز الاستشعار يقتصر على 200 هرتز. وينطبق ذلك على جميع إصدارات التطبيق التي تعرض تحميلاً زائدًا طريقةregisterListener()
. - إذا كنت تستخدم
صف واحد (
SensorDirectChannel
) أن معدل أخذ العينات المستشعرRATE_NORMAL
، وهو عادةً حوالي 50 هرتز.
إذا كان تطبيقك يحتاج إلى جمع بيانات جهاز استشعار الحركة بمعدّل أعلى، عليك تنفيذ ما يلي:
الإعلان عن
HIGH_SAMPLING_RATE_SENSORS
كما هو موضح في مقتطف الرمز التالي. وبخلاف ذلك، إذا حاول تطبيقك
جمع بيانات جهاز استشعار الحركة بمعدّل أعلى بدون إعلان هذا الإذن
حدوث SecurityException
.
ملف AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
أفضل الممارسات للوصول إلى أجهزة الاستشعار واستخدامها
أثناء تصميم وضع أداة الاستشعار، احرص على اتّباع الإرشادات التي تمت مناقشتها في هذا القسم. هذه الإرشادات هي أفضل الممارسات المقترَحة لأي شخص يستخدم إطار عمل أجهزة الاستشعار للوصول إلى أجهزة الاستشعار والحصول على بياناتها.
جمع بيانات أجهزة الاستشعار في المقدّمة فقط
على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android (المستوى 28 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، تخضع التطبيقات التي تعمل في الخلفية للقيود التالية:
- أجهزة الاستشعار التي تستخدم مستمرة وضع الإبلاغ، مثل مقاييس التسارع والجيروسكوب، لا أحداث.
- أجهزة الاستشعار التي تستخدم عند التغيير أو لقطة واحدة لا تتلقّى أوضاع إعداد التقارير أي أحداث.
في ضوء هذه القيود، من الأفضل رصد أحداث أجهزة الاستشعار عندما يكون تطبيقك في المقدّمة أو كجزء من خدمة تعمل في المقدّمة.
إلغاء تسجيل أدوات معالجة المستشعر
احرص على إلغاء تسجيل أداة استماع أداة استشعار عند الانتهاء من استخدام أداة الاستشعار أو عند الانتهاء من استخدام أداة الاستشعار
توقف النشاط مؤقتًا. في حال تسجيل مستمع أداة استشعار وتم إيقاف نشاطه مؤقتًا، سيواصل أداة الاستشعار
الحصول على البيانات واستخدام موارد البطارية ما لم تلغِ تسجيل أداة الاستشعار. يوضّح الرمز البرمجي التالي كيفية استخدام الطريقة onPause()
لإلغاء تسجيل مستمع:
private lateinit var sensorManager: SensorManager ... override fun onPause() { super.onPause() sensorManager.unregisterListener(this) }
private SensorManager sensorManager; ... @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); }
لمزيد من المعلومات، يُرجى الاطّلاع على unregisterListener(SensorEventListener)
.
الاختبار باستخدام "محاكي Android"
يتضمن محاكي Android مجموعة من عناصر التحكم في أجهزة الاستشعار الافتراضية التي تتيح لاختبار المستشعرات مثل مقياس التسارع ودرجة الحرارة المحيطة ومقياس المغناطيسية والتقارب والضوء وغير ذلك.
ويستخدم المحاكي اتصالاً بجهاز Android SdkControllerSensor التطبيق. لاحظ أن هذا التطبيق متاح فقط على الأجهزة التي تعمل بنظام التشغيل Android 4.0 (واجهة برمجة التطبيقات) المستوى 14) أو أعلى. (إذا كان الجهاز يعمل بنظام التشغيل Android 4.0، فيجب أن يتضمن تم تثبيت النسخة السابقة 2.) يراقب تطبيق SdkControllerSensor التغييرات في المستشعرات الموجودة على الجهاز ويرسلها إلى المحاكي. تتم بعد ذلك معالجة المحاكي استنادًا إلى القيم الجديدة التي يتلقّاها من أجهزة الاستشعار في جهازك.
يمكنك عرض رمز المصدر لتطبيق SdkControllerSensor في الموقع التالي:
$your-android-sdk-directory /tools/apps/SdkController
لنقل البيانات بين جهازك والمحاكي، اتّبِع الخطوات التالية:
- تحقق من أن USB تفعيل تصحيح الأخطاء على جهازك.
- وصِّل جهازك بجهاز التطوير باستخدام كابل USB.
- ابدأ تشغيل تطبيق SdkControllerSensor على جهازك.
- في التطبيق، اختَر أدوات الاستشعار التي تريد محاكاتها.
شغِّل أمر
adb
التالي:- ابدأ تشغيل المحاكي. ومن المفترض أن يكون بإمكانك الآن تطبيق عمليات التحويل على عن طريق تحريك جهازك.
$ adb forward tcp:1968 tcp:1968
ملاحظة: إذا لم تؤدِ الحركات التي تجريها على
الجهاز الفعلي إلى تحويل المحاكي، حاوِل تنفيذ الأمر
adb
من الخطوة 5 مرة أخرى.
لمزيد من المعلومات، يُرجى الاطّلاع على مقالة Android دليل المحاكي
لا تحظر الطريقة onSensorChanged().
يمكن أن تتغيّر بيانات أجهزة الاستشعار بمعدّل مرتفع، ما يعني أنّ النظام قد يستدعي طريقة onSensorChanged(SensorEvent)
كثيرًا. من أفضل الممارسات
عدم إجراء أيّ تغييرات ضرورية في طريقة onSensorChanged(SensorEvent)
لتجنّب حظرها. إذا كان
إجراء أي تصفية أو خفض لبيانات المستشعر، فينبغي عليك إجراء
التي تعمل خارج طريقة onSensorChanged(SensorEvent)
.
تجنُّب استخدام طرق تم إيقافها نهائيًا أو أنواع أدوات الاستشعار
تم إيقاف استخدام العديد من الطرق والثوابت.
وعلى وجه التحديد، تم إيقاف نوع أداة الاستشعار TYPE_ORIENTATION
نهائيًا. للحصول على بيانات الاتجاه، يجب استخدام الطريقة getOrientation()
بدلاً من ذلك. وبالمثل،
تم إيقاف نوع جهاز استشعار واحد (TYPE_TEMPERATURE
) نهائيًا. يجب استخدام نوع TYPE_AMBIENT_TEMPERATURE
المستشعر بدلاً من ذلك على الأجهزة التي تعمل بالإصدار 4.0 من Android.
التحقّق من صحة بيانات أجهزة الاستشعار قبل استخدامها
تأكَّد دائمًا من توفُّر أداة استشعار على الجهاز قبل محاولة الحصول على بيانات منه. لاتفترض أنّ هناك جهاز استشعار متوفّرًا لمجرد أنّه جهاز استشعار يتم استخدامه بشكل متكرر. الشركات المصنِّعة للأجهزة هي لا يلزم توفير أي أجهزة استشعار محددة في أجهزتهم.
اختيار تأخيرات أجهزة الاستشعار بعناية
عند تسجيل جهاز استشعار باستخدام طريقة registerListener()
، احرص على اختيار معدّل تسليم مناسب
التطبيق أو حالة الاستخدام. يمكن أن توفّر أجهزة الاستشعار البيانات بمعدّلات عالية جدًا. السماح للنظام بإرسال
فالبيانات الإضافية التي لا تحتاجها تؤدي إلى إهدار موارد النظام وتستخدم طاقة البطارية.