أجهزة استشعار Master Android: الأجهزة والبرامج ومتعددة الأبعاد

مؤلف: John Stephens
تاريخ الخلق: 26 كانون الثاني 2021
تاريخ التحديث: 5 تموز 2024
Anonim
Soil NPK Sensor with Arduino and Android Cell Phone Application for monitoring Soil Nutrient
فيديو: Soil NPK Sensor with Arduino and Android Cell Phone Application for monitoring Soil Nutrient

المحتوى


اليوم ، أصبحت معظم أجهزة Android الحديثة مزودة بمجموعة من المستشعرات.

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

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

بحلول نهاية هذه المقالة ، ستعرف كيفية استخراج جزء واحد من البيانات من مستشعر Android ، وكيفية التعامل مع أجهزة الاستشعار التي توفر بياناتها في شكل صفيف متعدد الأبعاد.

ما أجهزة استشعار Android التي يمكنني استخدامها؟

يمكن تقسيم أجهزة استشعار Android إلى الفئات التالية:

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


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

بالإضافة إلى ذلك ، يمكن أن تكون أجهزة الاستشعار إما:

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

أجهزة استشعار البيئة: قياس الإضاءة المحيطة

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


في هذا القسم ، سننشئ تطبيقًا يسترجع قيمة lux الحالية من مستشعر الإضاءة بالجهاز ، ويعرضها في TextView ، ثم نقوم بتحديث TextView كلما توفرت بيانات جديدة.يمكنك بعد ذلك استخدام هذه المعلومات في مجموعة من التطبيقات ، على سبيل المثال ، يمكنك إنشاء تطبيق شعلة يسحب المعلومات من مستشعر الضوء ثم يقوم تلقائيًا بضبط قوة شعاعه استنادًا إلى مستويات الإضاءة الحالية.

قم بإنشاء مشروع Android جديد بالإعدادات التي تختارها ، ودعنا نبدأ!

عرض بيانات الاستشعار الخاصة بك

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

افتح ملف activity_main.xml الخاص بمشروعك ، وأضف ما يلي:

بعد ذلك ، نحتاج إلى إنشاء مورد سلسلة "light_sensor" المشار إليه في تخطيطنا. افتح ملف strings.xml لمشروعك ، وأضف ما يلي:

مستشعر الضوء:٪ 1 $ .2f

"٪ 1 $ .2f" هو عنصر نائب يحدد المعلومات التي نريد عرضها ، وكيف يجب تنسيقها:

  • %1. يمكنك إدراج عناصر نائب متعددة في نفس المورد سلسلة؛ يشير "٪ 1" إلى أننا نستخدم عنصر نائب واحد.
  • $.2. يحدد هذا كيفية قيام التطبيق لدينا بتنسيق كل قيمة من قيم الفاصلة العائمة الواردة. يشير "$ .2" إلى أنه يجب تقريب القيمة إلى منزلتين عشريتين.
  • F. تنسيق القيمة كرقم الفاصلة العائمة.

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

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

بينما يكون لدينا ملف strings.xml مفتوحًا ، فلنقم بإنشاء سلسلة "no_sensor" ، والتي سنعرضها إذا كان مستشعر الإضاءة غير متوفر:

لا يوجد مستشعر للضوء متاح

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

الآن ، لا يمكن تنزيل التطبيق الخاص بك إلا على الأجهزة التي تحتوي على مستشعر بوصلة.

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

التواصل مع جهاز استشعار: SensorManager ، SensorEvents ، والمستمعين

للتواصل مع مستشعر إضاءة الجهاز ، يلزمك إكمال الخطوات التالية:

1. الحصول على مثيل SensorManager

يوفر SensorManager جميع الطرق التي تحتاجها للوصول إلى مجموعة كاملة من أجهزة الاستشعار.

للبدء ، قم بإنشاء متغير يحتوي على مثيل لـ SensorManager:

مستشعر خاص للضوء SensorManager.

بعد ذلك ، تحتاج إلى الحصول على مثيل لـ SensorManager ، عن طريق استدعاء الأسلوب Context.getSystemService وتمرير وسيطة Context.SENSOR_SERVICE:

lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE)؛

2. الحصول على إشارة إلى lightTextView

بعد ذلك ، نحتاج إلى إنشاء متغير عضو خاص يحتفظ بكائنات TextView الخاصة بنا ، وقم بتعيينها إلى TextView لدينا:

TextView الخاصة lightTextView. ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView)؛

3. تحقق من وجود المستشعر على الجهاز الحالي

يمكنك الوصول إلى مستشعر معين عن طريق استدعاء الأسلوب getDefaultSensor () ، ثم تمريره إلى المستشعر المعني. ثابت النوع لمستشعر الضوء هو TYPE_LIGHT ، لذلك نحتاج إلى استخدام ما يلي:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT)؛

إذا لم يكن المستشعر موجودًا على هذا الجهاز ، فستعود طريقة getDefaultSensor () خالية ، وسنعرض سلسلة "no_sensor":

String sensor_error = getResources (). getString (R.string.no_sensor)؛ if (lightSensor == null) {lightTextView.setText (sensor_error)؛ }}

4. تسجيل المستمعين استشعار الخاص بك

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

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

لضمان إخطار التطبيق الخاص بنا بكائنات SensorEvent هذه ، نحتاج إلى تسجيل مستمع لهذا الحدث الحساس المحدد ، وذلك باستخدام registerListener الخاص بـ SensorManager.

تأخذ أسلوب registerListener () الوسائط التالية:

  • تطبيق أو سياق النشاط.
  • نوع المستشعر الذي تريد مراقبته.
  • معدل إرسال المستشعر لبيانات جديدة. سيوفر معدل أعلى للتطبيق الخاص بك مزيدًا من البيانات ، ولكنه سيستخدم أيضًا المزيد من موارد النظام ، خاصة عمر البطارية. للمساعدة في الحفاظ على بطارية الجهاز ، يجب أن تطلب الحد الأدنى من البيانات التي يتطلبها التطبيق. سأستخدم SensorManager.SENSOR_DELAY_NORMAL ، الذي يرسل بيانات جديدة مرة واحدة كل 200000 ميكروثانية (0.2 ثانية).

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

بدلاً من ذلك ، يجب عليك تسجيل أدوات استشعارك في طريقة دورة التشغيل onStart () للتطبيق:

Override محمية void onStart () {super.onStart ()؛ // إذا كان المستشعر متاحًا على الجهاز الحالي ... // if (lightSensor! = null) {//… ، ثم ابدأ في الاستماع // lightSensorManager.registerListener (هذا ، lightSensor ، SensorManager.SENSOR_DELAY_NORMAL)؛ }}

5. تطبيق عمليات الاسترجاعات SensorEventListener

SensorEventListener هي واجهة تستقبل الإخطارات من SensorManager
كلما توفرت بيانات جديدة ، أو تغيرت دقة المستشعر.

الخطوة الأولى ، هي تعديل توقيعنا الطبقي لتطبيق واجهة SensorEventListener:

MainActivity من الفئة العامة تمد AppCompatActivity بتطبيق SensorEventListener {

نحتاج بعد ذلك إلى تطبيق أساليب رد الاتصال التالية:

onSensorChanged ()

تسمى هذه الطريقة استجابة لكل SensorEvent جديد.

غالبًا ما تتغير بيانات المستشعر بسرعة ، لذلك قد يتصل التطبيق الخاص بك بأسلوب onSensorChanged () بشكل منتظم. للمساعدة في الحفاظ على تشغيل التطبيق بسلاسة ، يجب أن تقوم بأدنى قدر ممكن من العمل داخل طريقة onSensorChanged ().

Override public void onSensorChanged (SensorEvent sensorEvent) {// To //

onAccuracyChanged ()

إذا تحسنت دقة المستشعر أو انخفضت ، فسيقوم Android باستدعاء طريقة onAccuracyChanged () ويمررها كائنا مستشعرًا يحتوي على قيمة الدقة الجديدة ، مثل SENSOR_STATUS_UNRELIABLE أو SENSOR_STATUS_ACCURACY_HIGH.

لا يقوم مستشعر الإضاءة بالإبلاغ عن تغييرات في الدقة ، لذلك سأترك رد الاتصال onAccuracyChanged () فارغًا:

Override public void onAccuracyChanged (مستشعر الاستشعار ، int) {// للقيام //}}

6. استرداد قيمة الاستشعار

كلما كانت لدينا قيمة جديدة ، نحتاج إلى استدعاء الأسلوب onSensorChanged () ، واسترداد السلسلة "light_sensor". يمكننا بعد ذلك تجاوز نص العنصر النائب للسلسلة (٪ 1 $ .2f) وعرض السلسلة المحدثة كجزء من TextView لدينا:

Override public void onSensorChanged (SensorEvent sensorEvent) {// القيمة الحالية للمستشعر // float currentValue = sensorEvent.values؛ // استرداد السلسلة "light_sensor" ، أدخل القيمة الجديدة وعرضها على المستخدم // lightTextView.setText (getResources (). getString (R.string.light_sensor، currentValue)) ؛ }

7. قم بإلغاء تسجيل مستمعيك

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

لإيقاف الاستماع عن أحداث المستشعر عندما يكون تطبيقك في الخلفية ، أضف unregisterListener () إلى طريقة دورة حياة onStop () لمشروعك:

Override محمية void onStop () {super.onStop ()؛ lightSensorManager.unregisterListener (هذا)؛ }

لاحظ أنه لا يجب إلغاء تسجيل المستمعين في onPause () ، كما هو الحال في Android 7.0 ويمكن تشغيل التطبيقات الأعلى في وضع تقسيم الشاشة وصورة في الصورة ، حيث يكونون في حالة متوقفة مؤقتًا ، ولكن تظل مرئية على الشاشة.

استخدام مستشعرات ضوء Android: رمز مكتمل

بعد الانتهاء من جميع الخطوات المذكورة أعلاه ، يجب أن تبدو MainActivity الخاصة بمشروعك على النحو التالي:

استيراد android.support.v7.app.AppCompatActivity؛ استيراد android.os.Bundle ؛ استيراد android.content.Context؛ استيراد android.hardware.Sensor ؛ استيراد android.hardware.SensorEvent ؛ استيراد android.hardware.SensorEventListener ؛ استيراد android.hardware.SensorManager ؛ استيراد android.widget.TextView؛ الفئة العامة MainActivity يمتد AppCompatActivity // تطبيق واجهة SensorEventListener // تطبق SensorEventListener {// اصنع متغيراتك // private sensor lightSensor؛ مستشعر خاص للضوء SensorManager. TextView الخاصة lightTextView. Override محمية void onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState)؛ setContentView (R.layout.activity_main)؛ lightTextView = (TextView) findViewById (R.id.lightTextView) ؛ // احصل على مثيل لـ SensorManager // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE)؛ // ابحث عن مستشعر الضوء // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT)؛ // إذا لم يكن مستشعر الإضاءة موجودًا ، فقم بعرض خطأ // String sensor_error = getResources (). getString (R.string.no_sensor)؛ if (lightSensor == null) {lightTextView.setText (sensor_error)؛ }}Override محمية void onStart () {super.onStart ()؛ // إذا كان المستشعر متاحًا على الجهاز الحالي ... // if (lightSensor! = null) {//… ، ثم سجل مستمعًا / lightSensorManager.registerListener (هذا ، lightSensor ، // حدد عدد المرات التي تريدها تلقي بيانات جديدة // SensorManager.SENSOR_DELAY_NORMAL) ؛ }} @ Oververide محمية void onStop () {super.onStop ()؛ // إلغاء تسجيل المستمع // lightSensorManager.unregisterListener (هذا) ؛ } @ Oververide public void onSensorChanged (SensorEvent sensorEvent) {// القيمة الحالية للمستشعر // float currentValue = sensorEvent.values؛ // استرداد السلسلة "light_sensor" ، أدخل القيمة الجديدة وقم بتحديث TextView // lightTextView.setText (getResources (). getString (R.string.light_sensor، currentValue))؛ }Override // إذا كانت دقة المستشعر تتغير ..... باطلة عامة onAccuracyChanged (مستشعر الاستشعار ، int) {{TO TO //}}

اختبر تطبيق مستشعر Android المكتمل

لاختبار هذا التطبيق على هاتف ذكي أو جهاز لوحي يعمل بنظام Android:

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

إذا كنت تستخدم جهاز Android الظاهري (AVD) ، فسيحتوي المحاكي على مجموعة من عناصر التحكم في المستشعر الظاهري التي يمكنك استخدامها لمحاكاة مختلف أحداث المستشعر. يمكنك الوصول إلى عناصر التحكم هذه في المستشعر الظاهري ، عبر نافذة "عناصر التحكم الموسعة" الخاصة بالمحاكي:

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

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

  • ابحث عن شريط التمرير "Light (lux)" واسحبه إلى اليسار واليمين ، لتغيير مستويات الإضاءة المحاكاة. يجب أن يعرض تطبيقك هذه القيم المتغيرة في الوقت الفعلي.

يمكنك تنزيل المشروع المكتمل من جيثب.

قياس المسافة ، مع أجهزة استشعار القرب الروبوت

لقد رأينا الآن كيفية استرداد المعلومات من جهاز استشعار البيئة ، دعونا نلقي نظرة على كيفية تطبيق هذه المعرفة على موضع المستشعر.

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

إنشاء واجهة المستخدم

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

بعد ذلك ، افتح ملف strings.xml الخاص بك وقم بإنشاء سلسلة "قرب_سنسور ". مرة أخرى ، يجب أن تحتوي هذه السلسلة على عنصر نائب ، سيتم ملؤه في النهاية بالبيانات المستخرجة من مستشعر القرب:

مستشعر القرب مستشعر القرب:٪ 1 $ .2f لا يوجد مستشعر القرب متاح

الحصول على البيانات من مستشعر القرب

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

  • قم بإنشاء مثيل لـ SensorManager ، وسأقوم هذه المرة حوله بتسمية "nearSensorManager".
  • الحصول على مثيل "القرب من SensorManager."
  • إنشاء إشارة إلى "القرب النصي".
  • استدعاء الأسلوب getDefaultSensor () ، وتمريرها إلى جهاز استشعار TYPE_PROXIMITY.
  • تسجيل وإلغاء تسجيل المستمعين لمستشعر القرب.

بعد إجراء هذه التعديلات ، يجب أن ينتهي الأمر بما يلي:

استيراد android.support.v7.app.AppCompatActivity؛ استيراد android.os.Bundle ؛ استيراد android.content.Context؛ استيراد android.hardware.Sensor ؛ استيراد android.hardware.SensorEvent ؛ استيراد android.hardware.SensorManager ؛ استيراد android.hardware.SensorEventListener ؛ استيراد android.widget.TextView؛ الفئة العامة MainActivity يمتد AppCompatActivity // تطبيق واجهة SensorEventListener // تطبق SensorEventListener {// اصنع متغيراتك // private Sensor nearSensor؛ خاصة SensorManager القرب SensorManager. TextView القرب TextTextView. Override محمية void onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState)؛ setContentView (R.layout.activity_main)؛ nearTextView = (TextView) findViewById (R.id.proximityTextView) ؛ // الحصول على مثيل لـ SensorManager // nearSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE)؛ // التحقق من وجود مستشعر القرب // القرب من المستشعر = القرب المستنبط.المناطق.التعريف بالمدفع (Sensor.TYPE_PROXIMITY) // إذا لم يكن مستشعر القرب موجودًا ، فقم بعرض خطأ // String sensor_error = getResources (). getString (R.string.no_sensor)؛ إذا كان (قربسنسور == لاغٍ) {nearTextView.setText (sensor_error) ؛ }}Override محمية void onStart () {super.onStart ()؛ // إذا كان المستشعر متاحًا على الجهاز الحالي ... // إذا (قرب (SensSensor! = null) {//… ، ثم سجل مستمعًا / "nearSensorManager.registerListener" (هذا ، بالقرب من Sensensor ، // حدد عدد المرات التي تريدها تلقي بيانات جديدة // SensorManager.SENSOR_DELAY_NORMAL) ؛ }} @ Oververide محمية void onStop () {super.onStop ()؛ / / قم بإلغاء تسجيل المستمع للحفاظ على موارد النظام // القرب من SensorManager.unregisterListener (هذا) ؛ } @ Oververide public void onSensorChanged (SensorEvent sensorEvent) {// القيمة الحالية للمستشعر // float currentValue = sensorEvent.values؛ // استرجع السلسلة "القرب_سنسور" ، وأدخل القيمة الجديدة وقم بتحديث النص "النص القرب / القرب". (getResources (). getString (R.string.pro القرب_الحساس ، التيار) القيمة)) ؛ }Override // إذا كانت دقة المستشعر تتغير ..... باطلة عامة onAccuracyChanged (مستشعر الاستشعار ، الباحث الأول) {//...TO DO //}}

اختبار: ما مدى قرب المستخدم من أجهزتهم؟

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

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

لاختبار هذا التطبيق على محاكي:

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

يمكنك تنزيل المشروع المكتمل من جيثب.

مجسات الحركة: معالجة المصفوفات متعددة الأبعاد

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

يمكن أن تساعدك أجهزة استشعار الحركة على:

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

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

سننشئ تطبيقًا يستخدم مستشعر ناقل الدوران لقياس:

  • ملعب كورة قدم. هذا هو الميل من أعلى إلى أسفل للجهاز.
  • تدحرج. هذا هو الميل من اليسار إلى اليمين للجهاز.

عرض في الوقت الحقيقي الملعب ولفة البيانات

نظرًا لأننا نقيس مقياسين ، فنحن بحاجة إلى إنشاء نصَيْن TextViews وموردي سلسلة متماثلين:

افتح ملف strings.xml ، وأضف ما يلي:

MotionSensors جهاز استشعار الملعب:٪ 1 $ .2f مستشعر الأسطوانة:٪ 1 $ .2f لا يوجد استشعار الحركة المتاحة

استخدام جهاز استشعار ناقل الدوران في تطبيقك

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

1. استخدم TYPE_ROTATION_VECTOR

نظرًا لأننا نعمل مع مستشعر ناقل الدوران ، نحتاج إلى استدعاء الأسلوب getDefaultSensor () ، ثم تمريره ثابت TYPE_ROTATION_VECTOR:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR)؛

2. ترجمة بيانات الاستشعار

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

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

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

أولاً ، نظام إحداثيات الجهاز هو نظام إحداثي قياسي ثلاثي المحاور X و Y و Z ، حيث يتم تمثيل كل نقطة على كل من المحاور الثلاثة بواسطة ناقل ثلاثي الأبعاد. هذا يعني أننا بحاجة إلى إنشاء مجموعة من 9 قيم تعويم:

float rotationMatrix = تعويم جديد ؛

يمكننا بعد ذلك تمرير هذا الصفيف إلى أسلوب getRotationMatrix ():

SensorManager.getRotationMatrixFromVector (rotationMatrix، vector)؛ int worldAxisX = SensorManager.AXIS_X؛ int worldAxisZ = SensorManager.AXIS_Z؛

الخطوة التالية ، تستخدم طريقة SensorManager.remapCoordinateSystem () لإعادة رسم خريطة بيانات المستشعر ، استنادًا إلى الاتجاه الحالي للجهاز.

تأخذ أسلوب SensorManager.remapCoordinateSystem () الوسائط التالية:

  • مصفوفة التناوب الأصلية.
  • المحاور التي تريد إعادة رسم خريطة لها.
  • الصفيف الذي تقوم بتزويده بهذه البيانات الجديدة.

إليك الرمز الذي سأستخدمه في تطبيقي:

float AdjustRotationMatrix = تعويم جديد ؛ SensorManager.remapCoordinateSystem (rotationMatrix، worldAxisX، worldAxisZ، adjustedRotationMatrix)؛

أخيرًا ، سنتصل بـ SensorManager.getOrientation ونخبره باستخدام المصفوفة المعدلة:

SensorManager.getOrientation (AdjustRotationMatrix، direction)؛

3. تحديث سلاسل العنصر النائب

نظرًا لأن لدينا مجموعتين من البيانات (خطوة ولفة) ، نحتاج إلى استرداد سلسلتين منفصلتين لعنصر نائب ، وملءهما بالقيم الصحيحة ، ثم تحديث TextView المطابق:

pitchTextView.setText (getResources (). getString (R.string.pitch_sensor، pitch))؛ rollTextView.setText (getResources (). getString (R.string.roll_sensor، roll))؛

عرض بيانات الاستشعار متعددة: أكمل رمز

بعد تنفيذ الخطوات المذكورة أعلاه ، يجب أن يبدو نشاطك الرئيسي على النحو التالي:

استيراد android.app.Activity ؛ استيراد android.os.Bundle ؛ استيراد android.hardware.Sensor ؛ استيراد android.hardware.SensorEvent ؛ استيراد android.hardware.SensorEventListener ؛ استيراد android.hardware.SensorManager ؛ استيراد android.widget.TextView؛ الطبقة العامة MainActivity يمتد النشاط ينفذ SensorEventListener {private SensorManager motionSensorManager؛ جهاز استشعار الحركة الخاصة TextView pitchTextView الخاص ؛ TextView rollTextView الخاص ؛ نهائي ثابت ثابت الخاص SENSOR_DELAY = 500 * 1000 ؛ نهائي ثابت خاص int FROM_RADS_TO_DEGS = -57؛ Override محمية void onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState)؛ setContentView (R.layout.activity_main)؛ pitchTextView = (TextView) findViewById (R.id.pitchTextView)؛ rollTextView = (TextView) findViewById (R.id.rollTextView) ؛ جرب {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE)؛ motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR)؛ motionSensorManager.registerListener (هذا ، motionSensor ، SENSOR_DELAY) ؛ } catch (استثناء e) {pitchTextView.setText (R.string.no_sensor)؛ rollTextView.setText (R.string.no_sensor)؛ . }} تحديث الفراغ الخاص (الموجهات الطافية) {// حساب مصفوفة التدوير // float rotationMatrix = new float؛ SensorManager.getRotationMatrixFromVector (rotationMatrix، vector)؛ int worldAxisX = SensorManager.AXIS_X؛ int worldAxisZ = SensorManager.AXIS_Z؛ // أعد توجيه المصفوفة استنادًا إلى اتجاه النشاط الحالي // float adjustedRotationMatrix = new float؛ SensorManager.remapCoordinateSystem (rotationMatrix، worldAxisX، worldAxisZ، adjustedRotationMatrix)؛ // حساب اتجاه الأجهزة // اتجاه تعويم = تعويم جديد ؛ // قم بتزويد صفيف قيم التعويم إلى طريقة getOrientation () // SensorManager.getOrientation (AdjustRotationMatrix ، direction) ؛ الملعب العائم = الاتجاه * FROM_RADS_TO_DEGS ؛ لفة تعويم = الاتجاه * FROM_RADS_TO_DEGS ؛ // قم بتحديث TextViews باستخدام قيم pitch و roll // // pitchTextView.setText (getResources (). getString (R.string.pitch_sensor، pitch))؛ rollTextView.setText (getResources (). getString (R.string.roll_sensor، roll))؛ }}

يمكنك تنزيل المشروع المكتمل من جيثب.

اختبار تطبيقنا النهائي لجهاز استشعار Android

لاختبار تطبيق مستشعر Android rotation vector هذا على هاتف ذكي أو جهاز لوحي يعمل بنظام Android:

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

إذا كنت تختبر مشروعك على محاكي:

  • قم بتثبيت التطبيق على AVD الخاص بك.
  • حدد "المزيد" ، الذي يفتح نافذة "عناصر التحكم الموسعة".
  • في القائمة اليسرى ، حدد "أجهزة الاستشعار الافتراضية".
  • تأكد من تحديد علامة التبويب "التسارع". تحتوي علامة التبويب هذه على عناصر تحكم يمكنها محاكاة التغييرات في موضع الجهاز واتجاهه.
  • حاول تجربة مختلف منزلقات (Rotate: Z-Rot ، X-Rot ، Y-Rot ؛ و Move: X ، Y ، و Z) ومختلف أزرار "تدوير الجهاز" ، لمعرفة كيف تؤثر على "مستشعر الأسطوانة" للتطبيق الخاص بك "و" الملعب الاستشعار "القيم.

تغليف

في هذه المقالة ، رأينا كيفية استرداد البيانات من الفئات الرئيسية الثلاث لأجهزة استشعار Android: البيئة والموقف والحركة وكيفية مراقبة هذه البيانات في الوقت الفعلي.

هل شاهدت أي تطبيقات Android تستخدم أجهزة استشعار بطرق مثيرة للاهتمام أو فريدة من نوعها؟ اسمحوا لنا أن نعرف في التعليقات أدناه!

تم الكشف عن أول هاتف ذكي من Xiaomi كجزء من اتفاقها مع شركة تطبيقات تجميل Meitu في 2 يوليو ، وذلك وفقًا لما كشفه العملاق المحمول على Weibo.كشفت الشركة أيضًا عن بعض التفاصيل الإضافية حول Weibo ، بما في ...

من Apple و Google إلى Fitbit و amung ، يبدو أن كل علامة تجارية لها خدمة دفع من نوع ما. لدى Xiaomi تطبيق الدفع الخاص بها أيضًا ، ولكنه كان شأنا صينيا فقط في البداية....

شائع