نظرة عامة على أجهزة الاستشعار

تحتوي معظم الأجهزة التي تعمل بنظام التشغيل Android على أدوات استشعار مدمجة تقيس الحركة والاتجاه والظروف البيئية المختلفة. أجهزة الاستشعار هذه قادرة على توفير بيانات أولية ذات الدقة والدقة، وهي مفيدة إذا كنت تريد مراقبة حركة الجهاز ثلاثية الأبعاد أو أو تريد مراقبة التغيرات في البيئة المحيطة بالقرب من الجهاز. على سبيل المثال، قد تتتبّع اللعبة القراءات من جهاز استشعار الجاذبية على الجهاز لاستنتاج إيماءات المستخدم المعقدة وحركات مثل الإمالة أو الاهتزاز أو التدوير أو التأرجح. وبالمثل، قد يستخدم تطبيق طقس جهاز استشعار الحرارة في الجهاز وجهاز استشعار الرطوبة لاحتساب نقطة الندى أو معدّل التنقّل أداة استشعار المجال المغناطيسي الأرضي ومقياس التسارع للإبلاغ عن بوصلة تحمل.

يتوافق نظام Android الأساسي مع ثلاث فئات واسعة من أدوات الاستشعار:

  • أجهزة استشعار الحركة

    تقيس أدوات الاستشعار هذه قُوى التسارع وقوى الدوران على طول ثلاثة محاور. هذا النمط مقاييس التسارع وأجهزة استشعار الجاذبية والجيروسكوب والمتجهات الدورانية أجهزة الاستشعار.

  • أدوات الاستشعار البيئية

    تقيس أجهزة الاستشعار هذه معلَمات بيئية مختلفة، مثل درجة حرارة الهواء المحيط. والضغط والإضاءة والرطوبة. تتضمن هذه الفئة مقاييس الضغط الجوي، ومقاييس الضوء، وموازين الحرارة.

  • أدوات استشعار الموضع

    تقيس أجهزة الاستشعار هذه الموضع المادي للجهاز. تتضمن هذه الفئة وأجهزة استشعار الاتجاه ومقياس المغناطيسية.

يمكنك الوصول إلى أجهزة الاستشعار المتوفرة على الجهاز والحصول على بيانات جهاز الاستشعار الأولية من خلال استخدام إطار عمل جهاز الاستشعار. يوفّر إطار عمل أداة الاستشعار عدّة فئات وواجهات تساعدك على إجراء مجموعة متنوعة من المهام المتعلقة بأداة الاستشعار. على سبيل المثال، يمكنك استخدام إطار عمل أداة الاستشعار لتنفيذ ما يلي:

  • يمكنك تحديد أدوات الاستشعار المتوفرة على الجهاز.
  • تحديد قدرات جهاز استشعار فردي، مثل أقصى نطاق له والشركة المصنّعة والطاقة ومتطلباته والحل.
  • الحصول على بيانات جهاز الاستشعار الأولية وتحديد الحدّ الأدنى لمعدّل الحصول على بيانات أداة الاستشعار.
  • يمكنك تسجيل وإلغاء تسجيل أدوات معالجة أحداث المستشعر التي تراقب التغييرات في أداة الاستشعار.

يقدّم هذا الموضوع نظرة عامة على أدوات الاستشعار المتوفرة على نظام Android الأساسي. كما أنه يوفر مقدمة حول إطار عمل أداة الاستشعار.

مقدّمة عن أجهزة الاستشعار

يتيح لك إطار عمل أداة استشعار Android الوصول إلى العديد من أنواع أدوات الاستشعار. بعض أجهزة الاستشعار هذه يعتمد بعضها على الأجهزة وبعضها يعتمد على البرامج. المستشعرات المستندة إلى الأجهزة هي مكونات مادية تم إنشاؤها إلى هاتف محمول أو جهاز لوحي. فهي تستخرج بياناتها عن طريق القياس المباشر للبيئة مثل التسارع أو قوة المجال المغناطيسي الأرضي أو التغير الزاوي. مستندة إلى البرامج أجهزة الاستشعار ليست أجهزة مادية، على الرغم من أنها تحاكي أدوات استشعار تستند إلى الأجهزة. أدوات الاستشعار المستندة إلى البرامج أن تستمد بياناتها من واحد أو أكثر من أدوات الاستشعار القائمة على الأجهزة وتُسمّى أحيانًا البيانات الافتراضية أجهزة استشعار أو أجهزة استشعار اصطناعية. ومن الأمثلة على ذلك مستشعر التسارع الخطي ومستشعر الجاذبية أجهزة الاستشعار المستندة إلى البرامج. يلخّص الجدول 1 أدوات الاستشعار المتوافقة مع نظام التشغيل Android بدون خادم.

عدد قليل من الأجهزة التي تعمل بنظام التشغيل Android يضم كل أنواع أدوات الاستشعار. على سبيل المثال، تسمح معظم أجهزة الهاتف فالأجهزة اللوحية تحتوي على مقياس تسارع ومقياس مغناطيسية، ولكن في عدد قليل من الأجهزة مقاييس البارومترات أو موازين الحرارة ويمكن أيضًا أن يحتوي الجهاز على أكثر من جهاز استشعار من نوع معين. بالنسبة على سبيل المثال، يمكن أن يحتوي الجهاز على اثنين من أجهزة استشعار الجاذبية، ولكل منهما نطاق مختلف.

الجدول 1. أنواع أجهزة الاستشعار المتوافقة مع نظام Android الأساسي

أداة استشعار النوع الوصف الاستخدامات الشائعة
TYPE_ACCELEROMETER الأجهزة يقيس قوة التسارع بوحدة م/ث2 التي يتم تطبيقها على الجهاز على المحاور المادية الثلاثة (س وص وع)، بما في ذلك قوة الجاذبية. كشف الحركة (الاهتزاز والإمالة وما إلى ذلك)
TYPE_AMBIENT_TEMPERATURE الأجهزة تقيس درجة حرارة الغرفة المحيطة بدرجة مئوية (°م). انظر الملاحظة أدناه. يتم رصد درجات حرارة الهواء.
TYPE_GRAVITY البرامج أو الأجهزة يقيس قوة الجاذبية بوحدة القياس م/ث2 التي يتم تطبيقها على الجهاز على جميع ثلاثة محاور فعلية (س، ص، ع). كشف الحركة (الاهتزاز والإمالة وما إلى ذلك)
TYPE_GYROSCOPE الأجهزة تقيس معدّل دوران الجهاز بالراد/الثانية حول كل من الثلاثة محاور مادية (س، ص، ع). اكتشاف التدوير (دوران، دوران، إلخ.).
TYPE_LIGHT الأجهزة يقيس مستوى الإضاءة المحيطة (الإضاءة) بالوحدة. التحكّم في سطوع الشاشة
TYPE_LINEAR_ACCELERATION البرامج أو الأجهزة يقيس قوة التسارع بوحدة المتر/الثانية2 والتي تساوي تم التطبيق على جهاز في المحاور المادية الثلاثة (س وص وع)، باستثناء قوة الجاذبية. رصد التسارع على محور واحد.
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
يمكنك استخدام هذه الفئة لإنشاء مثيل لجهاز استشعار معيّن. يوفر هذا الفصل عدة التي تتيح لك تحديد قدرات جهاز الاستشعار.
SensorEvent
يستخدم النظام هذه الفئة لإنشاء كائن حدث أداة استشعار، ما يوفر معلومات عن حدث جهاز الاستشعار. يتضمن كائن حدث المستشعر المعلومات التالية: بيانات جهاز الاستشعار الأولية نوع أداة الاستشعار التي أدت إلى إنشاء الحدث ودقة البيانات والطابع الزمني فعالية
.
SensorEventListener
يمكنك استخدام هذه الواجهة لإنشاء طريقتين لمعاودة الاتصال تتلقى الإشعارات (أداة الاستشعار) الأحداث) عندما تتغير قيم أداة الاستشعار أو عندما تتغيّر دقة أداة الاستشعار.

في التطبيقات النموذجية، تستخدم واجهات برمجة التطبيقات المتعلقة بالمستشعرات هذه لأداء مهمتين أساسيتين:

  • التعرّف على أجهزة الاستشعار وإمكاناتها

    يُعد تحديد أجهزة الاستشعار وإمكاناتها في وقت التشغيل مفيدًا إذا كان التطبيق الميزات التي تعتمد على أنواع أو إمكانات محددة من أدوات الاستشعار. على سبيل المثال، قد ترغب في التعرّف على جميع أدوات الاستشعار المتوفرة على الجهاز وإيقاف أي ميزات من ميزات التطبيقات التي تعتمد على أدوات استشعار غير موجودة وبالمثل، قد تحتاج إلى التعرّف على جميع أدوات الاستشعار من أي نوع محدَّد حتى يمكنك اختيار أداة الاستشعار التي تحقق الأداء الأمثل على تطبيقك.

  • مراقبة أحداث أجهزة الاستشعار

    مراقبة أحداث المستشعر هي الطريقة التي تحصل من خلالها على بيانات جهاز الاستشعار الأولية. يحدث حدث استشعار في كل مرة يرصد جهاز الاستشعار تغييرًا في المعاملات التي يقيسها. يمنحك حدث المستشعر أربع معلومات: اسم أداة الاستشعار التي تسبّبت في وقوع الحدث، الطابع الزمني للحدث ودقة الحدث وبيانات أداة الاستشعار الأولية التي شغّلت الحدث الحدث.

توفُّر أدوات الاستشعار

يختلف مدى توفّر أدوات الاستشعار من جهاز إلى آخر، ولكن يمكن أن يختلف أيضًا بين أجهزة Android. مماثلة. والسبب هو أنّ "أدوات استشعار Android" تم تقديمها على مدار عدة إصدارات المنصة. على سبيل المثال، تم تقديم العديد من أدوات الاستشعار في Android 1.5 (المستوى 3 لواجهة برمجة التطبيقات)، ولكن تم تقديم بعض أدوات الاستشعار لم يتم تنفيذها ولم تكن متاحة للاستخدام حتى Android 2.3 (مستوى واجهة برمجة التطبيقات 9). وبالمثل، تم تقديم العديد من أدوات الاستشعار في Android 2.3 (المستوى 9 لواجهة برمجة التطبيقات) وAndroid 4.0 (المستوى 14 لواجهة برمجة التطبيقات). قطعتان تم إيقاف أجهزة الاستشعار واستبدالها بأجهزة استشعار أحدث ومحسّنة.

يلخّص الجدول 2 مدى توفّر كل جهاز استشعار على أساس كلّ منصة على حدة. أربعة فقط هذه المنصات هي المنصات التي تسببت في حدوث تغيرات في المستشعرات. تُعد أجهزة الاستشعار المدرجَة على أنّها متوقّفة نهائيًا لا تزال متاحة على المنصّات اللاحقة (بشرط أداة الاستشعار متوفّرة على أحد الأجهزة)، وذلك بما يتوافق مع سياسة التوافق مع طلبات إعادة التوجيه في Android.

الجدول 2. مدى توفّر أجهزة الاستشعار حسب النظام الأساسي

أداة استشعار Android 4.0
(المستوى 14)
Android 2.3
(المستوى 9 من واجهة برمجة التطبيقات)
Android 2.2
(المستوى 8 من واجهة برمجة التطبيقات)
Android 1.5
(مستوى واجهة برمجة التطبيقات 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. مثلاً:

Kotlin

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

Java

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

بعد ذلك، يمكنك الحصول على قائمة بكل جهاز استشعار على أحد الأجهزة من خلال الاتصال طريقة getSensorList() واستخدام الثابت TYPE_ALL. مثلاً:

Kotlin

val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)

Java

List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

إذا أردت إدراج جميع المستشعرات من نوع معين، فيمكنك استخدام ثابت آخر بدلاً من TYPE_ALL مثل TYPE_GYROSCOPE، TYPE_LINEAR_ACCELERATION، أو TYPE_GRAVITY

يمكنك أيضًا تحديد ما إذا كان الجهاز نوعًا معيّنًا من أدوات الاستشعار متاحًا من خلال طريقة getDefaultSensor() وتحديد النوع. ثابت لمستشعر معين. إذا كان الجهاز يحتوي على أكثر من جهاز استشعار من نوع معين، يمكن استخدام أحد أجهزة الاستشعار يجب تعيين أجهزة الاستشعار كأداة الاستشعار التلقائية. إذا لم يتم العثور على جهاز استشعار افتراضي نوع جهاز استشعار، يكون ناتج استدعاء الطريقة قيمة خالية، مما يعني أن الجهاز لا يحتوي على هذا النوع أداة الاستشعار. على سبيل المثال، يتحقّق الرمز التالي مما إذا كان هناك مقياس مغناطيسية على أحد الأجهزة:

Kotlin

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.
}

Java

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. إذا كان هذا المستشعر تحديدًا غير متوفر على الجهاز، نحاول استخدام ومقياس التسارع.

Kotlin

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
    }
}

Java

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.

Kotlin

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)
    }
}

Java

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 ميكرو ثانية. يمكنك تحديد خيارات أخرى حالات التأخير في البيانات، مثل 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) ومستشعر المجال المغناطيسي لعرض درجة الحرارة والضغط والموقع واتجاه البوصلة. إذا كان الجهاز لا يتضمن مستشعرًا للضغط، يمكنك استخدام أداة استشعار الضغط لاكتشاف غياب مستشعر الضغط في وقت التشغيل ثم إيقاف جزء من واجهة مستخدم التطبيق يعرض الضغط. على سبيل المثال، يتم التحقق من التعليمة البرمجية التالية وجود جهاز استشعار ضغط على الجهاز:

Kotlin

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.
}

Java

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". يساعد هذا في ضمان الأجهزة يمكنها تثبيت تطبيقك حتى إذا لم يكن بها جهاز الاستشعار المحدّد. هذه أيضًا أفضل ممارسات إدارة المشروعات التي تساعدك في تتبع الميزات التي يستخدمها تطبيقك. ضع في اعتبارك أنه إذا كان التطبيق يستخدم أداة استشعار معينة، ولكنه لا يزال يعمل بدون هذا المستشعر، يجب بعد ذلك اكتشاف أداة الاستشعار في وقت التشغيل وإيقاف ميزات التطبيق أو تفعيلها مناسبًا.

نظام إحداثيات أداة الاستشعار

بشكل عام، يستخدم إطار عمل أداة الاستشعار نظام إحداثي قياسي ثلاثي المحاور للتعبير عن قيم البيانات. بالنسبة إلى معظم أدوات الاستشعار، يتم تحديد نظام الإحداثيات بالنسبة إلى شاشة الجهاز عندما يكون الجهاز في اتجاهه الافتراضي (انظر الشكل 1). عند تثبيت الجهاز في اتجاهه التلقائي، المحور س أفقي ويشير إلى اليمين، والمحور ص عمودي ويشير إلى الأعلى، وع يشير المحور إلى الجزء الخارجي من واجهة الشاشة. في هذا النظام، تظهر الإحداثيات خلف الشاشة تحتوي على قيم 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>

أفضل الممارسات للوصول إلى أجهزة الاستشعار واستخدامها

أثناء تصميم وضع أداة الاستشعار، احرص على اتّباع الإرشادات الموضّحة في هذا القسم. تقدّم هذه الإرشادات أفضل الممارسات لأي شخص يستخدم جهاز الاستشعار. الوصول إلى أجهزة الاستشعار والحصول على بياناتها.

جمع بيانات أداة الاستشعار في المقدّمة فقط

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 9 (المستوى 28 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، فإنّ التطبيقات التي تعمل في الخلفية القيود التالية:

  • أجهزة الاستشعار التي تستخدم مستمرة وضع الإبلاغ، مثل مقاييس التسارع والجيروسكوب، لا أحداث.
  • أجهزة الاستشعار التي تستخدم عند التغيير أو لقطة واحدة لا تتلقّى أوضاع إعداد التقارير أي أحداث.

بناءً على هذه القيود، من الأفضل رصد أحداث أداة الاستشعار عندما التطبيق في المقدّمة أو كجزء من التي تعمل في المقدّمة.

إلغاء تسجيل أدوات معالجة المستشعر

احرص على إلغاء تسجيل أداة استماع أداة الاستشعار عند الانتهاء من استخدام أداة الاستشعار أو عند الانتهاء من استخدام أداة الاستشعار توقف النشاط مؤقتًا. إذا تم تسجيل أداة استماع وتوقف نشاطها مؤقتًا، مواصلة الحصول على البيانات واستخدام موارد البطارية ما لم يتم إلغاء تسجيل أداة الاستشعار. ما يلي: يعرض الرمز كيفية استخدام طريقة onPause() لإلغاء تسجيل مستمع:

Kotlin

private lateinit var sensorManager: SensorManager
...
override fun onPause() {
    super.onPause()
    sensorManager.unregisterListener(this)
}

Java

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

لنقل البيانات بين جهازك والمحاكي، يمكنك اتّباع الخطوات التالية: الخطوات:

  1. تحقق من أن USB تفعيل تصحيح الأخطاء على جهازك.
  2. وصِّل جهازك بجهاز التطوير باستخدام كابل USB.
  3. ابدأ تشغيل تطبيق SdkControllerSensor على جهازك.
  4. في التطبيق، اختَر أدوات الاستشعار التي تريد محاكاتها.
  5. شغِّل أمر adb التالي:

  6. $ adb forward tcp:1968 tcp:1968
    
  7. ابدأ تشغيل المحاكي. ومن المفترض أن يكون بإمكانك الآن تطبيق عمليات التحويل على عن طريق تحريك جهازك.

ملاحظة: إذا كانت الحركات التي تجريها إلى الجهاز الفعلي لا يحوّل المحاكي، فحاول تشغيل adb من الخطوة 5 مرة أخرى.

لمزيد من المعلومات، يُرجى الاطّلاع على مقالة Android دليل المحاكي

عدم حظر طريقة onSensorChanged()

يمكن أن تتغيّر بيانات أجهزة الاستشعار بمعدّل مرتفع، ما يعني أنّ النظام قد يطلب إجراء onSensorChanged(SensorEvent) بمعدّل متكرّر. كأفضل ممارسة، يجب تطبيق أقل قدر ممكن من الإجراءات ضمن طريقة onSensorChanged(SensorEvent) لتجنُّب حظرها. إذا كان إجراء أي تصفية أو خفض لبيانات المستشعر، فينبغي عليك إجراء التي تعمل خارج طريقة onSensorChanged(SensorEvent).

تجنُّب استخدام طرق تم إيقافها نهائيًا أو أنواع أدوات الاستشعار

تم إيقاف عدة طرق وثوابت. وعلى وجه الخصوص، TYPE_ORIENTATION تم إيقاف نوع أداة الاستشعار نهائيًا. للحصول على بيانات الاتجاه، يجب استخدام الطريقة getOrientation() بدلاً من ذلك. وبالمثل، تم إيقاف نوع جهاز استشعار واحد (TYPE_TEMPERATURE) نهائيًا. يجب عليك استخدام نوع أداة الاستشعار TYPE_AMBIENT_TEMPERATURE بدلاً من ذلك على الأجهزة التي تعمل بنظام التشغيل Android 4.0.

التحقّق من صحة أجهزة الاستشعار قبل استخدامها

تأكَّد دائمًا من وجود جهاز استشعار على أحد الأجهزة قبل محاولة الحصول على بيانات منه. الإجراءات غير المستحسنة لنفترض أن هناك أداة استشعار موجودة ببساطة لأنه جهاز استشعار يُستخدم كثيرًا. الشركات المصنِّعة للأجهزة هي لا يلزم توفير أي أجهزة استشعار محددة في أجهزتهم.

اختيار تأخيرات أداة الاستشعار بعناية

عند تسجيل جهاز استشعار باستخدام طريقة registerListener()، احرص على اختيار معدّل تسليم مناسب التطبيق أو حالة الاستخدام. يمكن لأجهزة الاستشعار توفير البيانات بمعدّلات عالية جدًا. السماح للنظام بإرسال فالبيانات الإضافية التي لا تحتاجها تؤدي إلى إهدار موارد النظام وتستخدم طاقة البطارية.