يوفّر نظام التشغيل Android جهازَي استشعار يتيحان لك تحديد موضع الجهاز، وهما جهاز استشعار المجال المغناطيسي الأرضي ومقياس التسارع. توفّر منصة Android أيضًا مستشعرًا يتيح لك تحديد مدى قرب وجه الجهاز من أحد العناصر (يُعرف باسم مستشعر التقارب). يستند كل من مستشعر المجال المغناطيسي الأرضي ومستشعر التقارب إلى أجهزة. تتضمّن معظم الهواتف والأجهزة اللوحية جهاز استشعار للمجال المغناطيسي الأرضي. وبالمثل، يضمِّن مصنّعو الهواتف عادةً أداة استشعار تقارب لتحديد ما إذا كان الهاتف موضوعًا بالقرب من وجه المستخدم (مثلاً، أثناء إجراء مكالمة هاتفية). لتحديد اتجاه الجهاز، يمكنك استخدام القراءات من مقياس التسارع في الجهاز وأداة استشعار المجال المغناطيسي الأرضي.
ملاحظة: تم إيقاف مستشعر الاتجاه نهائيًا في Android 2.2 (المستوى 8 من واجهة برمجة التطبيقات)، وتم إيقاف نوع مستشعر الاتجاه نهائيًا في Android 4.4W (المستوى 20 من واجهة برمجة التطبيقات).
تكون مستشعرات تحديد الموضع مفيدة لتحديد الموضع الفعلي للجهاز في إطار المرجع العالمي. على سبيل المثال، يمكنك استخدام مستشعر المجال المغناطيسي الأرضي مع مقياس التسارع لتحديد موضع الجهاز بالنسبة إلى القطب الشمالي المغناطيسي. يمكنك أيضًا استخدام أجهزة الاستشعار هذه لتحديد اتجاه الجهاز في إطار المرجع الخاص بتطبيقك. لا تُستخدَم أجهزة استشعار الوضع عادةً لمراقبة حركة الجهاز، مثل الاهتزاز أو الإمالة أو الدفع (لمزيد من المعلومات، راجِع أجهزة استشعار الحركة).
يعرض مقياس المجال المغناطيسي الأرضي ومقياس التسارع صفائف متعددة الأبعاد لقيم المستشعر لكل SensorEvent
. على سبيل المثال، يوفّر مستشعر المجال المغناطيسي الأرضي قيمًا لقوة المجال المغناطيسي الأرضي لكل محور من محاور الإحداثيات الثلاثة أثناء حدث مستشعر واحد. وبالمثل، يقيس مستشعر مقياس التسارع التسارع المطبَّق على الجهاز أثناء حدث المستشعر. لمزيد من المعلومات حول أنظمة الإحداثيات التي تستخدمها أجهزة الاستشعار، يُرجى الاطّلاع على
أنظمة إحداثيات أجهزة الاستشعار. يوفّر مستشعر التقارب قيمة واحدة
لكل حدث من أحداث المستشعر. يلخّص الجدول 1 أجهزة استشعار تحديد الموقع الجغرافي المتوافقة مع نظام Android الأساسي.
الجدول 1. أدوات استشعار تحديد الموقع الجغرافي المتوافقة مع نظام التشغيل Android
أداة استشعار | بيانات أحداث المستشعر | الوصف | وحدات القياس |
---|---|---|---|
TYPE_GAME_ROTATION_VECTOR |
SensorEvent.values[0] |
مكوّن متّجه الدوران على طول المحور x (x * sin(θ/2)) | بدون وحدة |
SensorEvent.values[1] |
مكوّن متّجه الدوران على طول المحور y (y * sin(θ/2)). | ||
SensorEvent.values[2] |
مكوّن متّجه الدوران على طول المحور z (z * sin(θ/2)) | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR |
SensorEvent.values[0] |
مكوّن متّجه الدوران على طول المحور x (x * sin(θ/2)) | بدون وحدة |
SensorEvent.values[1] |
مكوّن متّجه الدوران على طول المحور y (y * sin(θ/2)). | ||
SensorEvent.values[2] |
مكوّن متّجه الدوران على طول المحور z (z * sin(θ/2)) | ||
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
قوة المجال المغناطيسي الأرضي على طول المحور x | μT |
SensorEvent.values[1] |
تمثّل هذه السمة شدة المجال المغناطيسي الأرضي على طول المحور y. | ||
SensorEvent.values[2] |
تمثّل هذه السمة شدة المجال المغناطيسي الأرضي على طول المحور z. | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
قوة المجال المغناطيسي الأرضي (بدون معايرة الحديد الصلب) على طول المحور x | μT |
SensorEvent.values[1] |
قوة المجال المغناطيسي الأرضي (بدون معايرة الحديد الصلب) على طول المحور y | ||
SensorEvent.values[2] |
قوة المجال المغناطيسي الأرضي (بدون معايرة الحديد الصلب) على طول المحور z | ||
SensorEvent.values[3] |
تقدير انحراف الحديد على طول المحور السيني | ||
SensorEvent.values[4] |
تقدير انحراف الحديد على طول المحور y | ||
SensorEvent.values[5] |
تقدير تحيز الحديد على طول المحور z | ||
TYPE_ORIENTATION 1 |
SensorEvent.values[0] |
السمت (الزاوية حول المحور z) | الدرجات |
SensorEvent.values[1] |
الميل (الزاوية حول المحور x) | ||
SensorEvent.values[2] |
الدوران (الزاوية حول المحور الصادي) | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
المسافة من العنصر2 | سم |
1تم إيقاف هذا المستشعر نهائيًا في الإصدار 2.2 من نظام التشغيل Android (المستوى 8 من واجهة برمجة التطبيقات)، وتم إيقاف نوع المستشعر هذا نهائيًا في الإصدار 4.4W من نظام التشغيل Android (المستوى 20 من واجهة برمجة التطبيقات). يوفّر إطار عمل أدوات الاستشعار طرقًا بديلة للحصول على اتجاه الجهاز، ويتم تناولها في حساب اتجاه الجهاز.
2 تقدّم بعض أدوات استشعار التقارب قيمًا ثنائية فقط تمثّل القرب والبعد.
استخدام أداة استشعار متّجه دوران الألعاب
مستشعر متجه دوران الألعاب مطابق لمستشعر متجه الدوران، إلا أنّه لا يستخدم المجال المغناطيسي الأرضي. لذلك، لا يشير المحور Y إلى الشمال، بل إلى مرجع آخر. ويُسمح بأن ينحرف المرجع بمقدار مماثل لمقدار انحراف الجيروسكوب حول المحور Z.
بما أنّ مستشعر متجه دوران الألعاب لا يستخدم المجال المغناطيسي، تكون عمليات الدوران النسبية أكثر دقة ولا تتأثر بالتغييرات في المجال المغناطيسي. استخدِم هذا المستشعر في لعبة إذا لم يكن يهمك تحديد الاتجاه الشمالي، ولم يكن متجه الدوران العادي مناسبًا لاحتياجاتك بسبب اعتماده على المجال المغناطيسي.
يوضّح الرمز التالي كيفية الحصول على مثيل لمستشعر متّجه دوران اللعبة التلقائي:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
استخدام أداة استشعار متجه الدوران المغناطيسي الأرضي
يشبه مستشعر متجه الدوران المغناطيسي الأرضي مستشعر متجه الدوران، ولكنّه لا يستخدم الجيروسكوب. دقة هذا المستشعر أقل من مستشعر متجه الدوران العادي، ولكن يتم تقليل استهلاك الطاقة. استخدِم هذا المستشعر فقط إذا كنت تريد جمع معلومات حول الدوران في الخلفية بدون استهلاك الكثير من طاقة البطارية. ويكون هذا المستشعر أكثر فائدة عند استخدامه مع ميزة تجميع البيانات.
يوضّح الرمز التالي كيفية الحصول على مثيل لمستشعر متّجه الدوران المغناطيسي الأرضي التلقائي:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
احتساب اتجاه الجهاز
من خلال احتساب اتجاه الجهاز، يمكنك تتبُّع موضع الجهاز بالنسبة إلى إطار مرجعي للأرض (وتحديدًا، القطب الشمالي المغناطيسي). يوضّح الرمز البرمجي التالي كيفية احتساب اتجاه الجهاز:
Kotlin
private lateinit var sensorManager: SensorManager ... // Rotation matrix based on current readings from accelerometer and magnetometer. val rotationMatrix = FloatArray(9) SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading) // Express the updated rotation matrix as three orientation angles. val orientationAngles = FloatArray(3) SensorManager.getOrientation(rotationMatrix, orientationAngles)
Java
private SensorManager sensorManager; ... // Rotation matrix based on current readings from accelerometer and magnetometer. final float[] rotationMatrix = new float[9]; SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // Express the updated rotation matrix as three orientation angles. final float[] orientationAngles = new float[3]; SensorManager.getOrientation(rotationMatrix, orientationAngles);
يحسب النظام زوايا الاتجاه باستخدام مستشعر المجال المغناطيسي الأرضي للجهاز مع مقياس التسارع الخاص بالجهاز. باستخدام أداتَي الاستشعار الماديتَين هاتَين، يوفّر النظام بيانات لزوايا الاتجاه الثلاث التالية:
- السمت (درجات الدوران حول المحور z-) وهي الزاوية بين اتجاه البوصلة الحالي للجهاز والشمال المغناطيسي. إذا كانت الحافة العلوية للجهاز تواجه الشمال المغناطيسي، يكون السمت 0 درجة، وإذا كانت الحافة العلوية تواجه الجنوب، يكون السمت 180 درجة. وبالمثل، إذا كانت الحافة العلوية متجهة نحو الشرق، يكون السمت 90 درجة، وإذا كانت الحافة العلوية متجهة نحو الغرب، يكون السمت 270 درجة.
- زاوية الميل (درجات الدوران حول المحور x) تمثّل هذه السمة الزاوية بين مستوى موازٍ لشاشة الجهاز ومستوى موازٍ للأرض. إذا أمسكت بالجهاز بشكل موازٍ للأرض وكان الحافة السفلية أقرب إليك، ثم أملت الحافة العلوية للجهاز نحو الأرض، ستصبح زاوية الميل موجبة. يؤدي الإمالة في الاتجاه المعاكس، أي تحريك الحافة العلوية للجهاز بعيدًا عن الأرض، إلى أن تصبح زاوية الميل سالبة. يتراوح نطاق القيم بين -90 درجة و90 درجة.
- الانحراف (درجات التدوير حول المحور الصادي) هذه هي الزاوية بين مستوى عمودي على شاشة الجهاز ومستوى عمودي على الأرض. إذا كنت تمسك الجهاز بشكل موازٍ للأرض بحيث تكون الحافة السفلية أقرب إليك وتميل الحافة اليسرى للجهاز نحو الأرض، تصبح زاوية الميل موجبة. يؤدي الإمالة في الاتجاه المعاكس، أي تحريك الحافة اليمنى للجهاز نحو الأرض، إلى أن تصبح زاوية الميل سالبة. يتراوح نطاق القيم بين -180 درجة و180 درجة.
ملاحظة:تم تغيير تعريف الميلان الخاص بالمستشعر ليعكس الغالبية العظمى من عمليات التنفيذ في المنظومة المتكاملة لمستشعرات الموقع الجغرافي.
يُرجى العلم أنّ هذه الزوايا تستند إلى نظام إحداثيات مختلف عن النظام المستخدَم في الطيران (للانحراف والارتفاع والانعطاف). في نظام الطيران، يقع المحور x على طول الجانب الطويل من الطائرة، من الذيل إلى المقدمة.
يستمد مستشعر الاتجاه بياناته من خلال معالجة بيانات المستشعر الأولية
من مستشعر التسارع ومستشعر المجال المغناطيسي الأرضي. وبسبب المعالجة الكبيرة التي تتطلّبها هذه العملية، تنخفض دقة مستشعر الاتجاه. على وجه التحديد، لا يمكن الاعتماد على أداة الاستشعار هذه إلا عندما تكون زاوية الميلان 0. نتيجةً لذلك، تم إيقاف مستشعر الاتجاه نهائيًا في Android 2.2 (المستوى 8 لواجهة برمجة التطبيقات)، وتم إيقاف نوع مستشعر الاتجاه نهائيًا في Android 4.4W (المستوى 20 لواجهة برمجة التطبيقات).
بدلاً من استخدام البيانات الأولية من مستشعر الاتجاه، ننصحك باستخدام الطريقة getRotationMatrix()
مع الطريقة getOrientation()
لحساب قيم الاتجاه، كما هو موضّح في نموذج الرمز البرمجي التالي. وكجزء من هذه العملية، يمكنك استخدام طريقة remapCoordinateSystem()
لترجمة قيم الاتجاه إلى إطار المرجع الخاص بتطبيقك.
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private val accelerometerReading = FloatArray(3) private val magnetometerReading = FloatArray(3) private val rotationMatrix = FloatArray(9) private val orientationAngles = FloatArray(3) public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } override fun onResume() { super.onResume() // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer -> sensorManager.registerListener( this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField -> sensorManager.registerListener( this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } } override fun onPause() { super.onPause() // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this) } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. override fun onSensorChanged(event: SensorEvent) { if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size) } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size) } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. fun updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix( rotationMatrix, null, accelerometerReading, magnetometerReading ) // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles) // "orientationAngles" now has up-to-date information. } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private final float[] accelerometerReading = new float[3]; private final float[] magnetometerReading = new float[3]; private final float[] rotationMatrix = new float[9]; private final float[] orientationAngles = new float[3]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } @Override protected void onResume() { super.onResume(); // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); if (magneticField != null) { sensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } } @Override protected void onPause() { super.onPause(); // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this); } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.length); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.length); } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. public void updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles); // "orientationAngles" now has up-to-date information. } }
لا تحتاج عادةً إلى إجراء أي معالجة للبيانات أو فلترة لزوايا الاتجاه الأولية للجهاز، باستثناء ترجمة نظام الإحداثيات الخاص بالمستشعر إلى إطار المرجع الخاص بتطبيقك.
استخدام مستشعر المجال المغناطيسي الأرضي
يتيح لك مستشعر المجال المغناطيسي الأرضي مراقبة التغييرات في المجال المغناطيسي للأرض. يوضّح لك الرمز التالي كيفية الحصول على مثيل لمستشعر المجال المغناطيسي الأرضي التلقائي:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
ملاحظة: إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، سيتم الحد من معدّل استخدام هذا المستشعر.
يوفّر هذا المستشعر بيانات أولية لقوة المجال (بوحدة μT) لكل محور من محاور الإحداثيات الثلاثة.
في العادة، لن تحتاج إلى استخدام أداة الاستشعار هذه مباشرةً. بدلاً من ذلك، يمكنك استخدام أداة استشعار متجه الدوران لتحديد الحركة الدورانية الأولية، أو يمكنك استخدام أداة استشعار مقياس التسارع وأداة استشعار المجال المغناطيسي الأرضي مع طريقة getRotationMatrix()
للحصول على مصفوفة الدوران ومصفوفة الميل. يمكنك بعد ذلك استخدام هذه المصفوفات مع الطريقتَين getOrientation()
وgetInclination()
للحصول على بيانات السمت والميل المغناطيسي الأرضي.
ملاحظة: عند اختبار تطبيقك، يمكنك تحسين دقة المستشعر عن طريق تحريك الجهاز على شكل الرقم 8.
استخدام مقياس المغناطيسية غير المعاير
يشبه مقياس المغناطيسية الذي لم تتم معايرته مستشعر المجال المغناطيسي الأرضي، إلا أنّه لا يتم تطبيق أي معايرة للحديد الصلب على المجال المغناطيسي. سيظل يتم تطبيق المعايرة الأصلية ومعدّل الحرارة على المجال المغناطيسي. يُعد مقياس المغناطيسية غير المعاير مفيدًا للتعامل مع التقديرات السيئة للحديد الصلب. بشكل عام، ستكون قيمة geomagneticsensor_event.values[0]
قريبة من uncalibrated_magnetometer_event.values[0] -
uncalibrated_magnetometer_event.values[3]
. وهذا يعني
calibrated_x ~= uncalibrated_x - bias_estimate_x
ملاحظة: تقدّم المستشعرات غير المعايرة نتائج أولية أكثر وقد تتضمّن بعض التحيز، ولكن تحتوي قياساتها على عدد أقل من القفزات الناتجة عن التصحيحات التي يتم تطبيقها من خلال المعايرة. قد تفضّل بعض التطبيقات هذه النتائج غير المعايرة لأنّها أكثر سلاسة وموثوقية. على سبيل المثال، إذا كان أحد التطبيقات يحاول إجراء دمج بيانات المستشعرات بنفسه، قد يؤدي إدخال عمليات المعايرة إلى تشويه النتائج.
بالإضافة إلى المجال المغناطيسي، يوفّر مقياس المغناطيسية غير المعاير أيضًا تقديرًا لانحياز الحديد الصلب في كل محور. يوضّح الرمز التالي كيفية الحصول على مثيل لمقياس المغناطيسية التلقائي غير المعاير:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
استخدام أداة استشعار التقارب
يتيح لك مستشعر التقارب تحديد مدى بُعد جسم ما عن جهاز. يوضّح الرمز التالي كيفية الحصول على مثيل لمستشعر التقارب التلقائي:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
يُستخدم مستشعر التقارب عادةً لتحديد المسافة بين رأس الشخص وشاشة الجهاز (على سبيل المثال، عندما يجري المستخدم مكالمة هاتفية أو يتلقّاها). تعرض معظم مستشعرات التقارب المسافة المطلقة بالسنتيمتر، ولكن بعضها يعرض قيمتَي "قريب" و"بعيد" فقط.
ملاحظة: في بعض طُرز الأجهزة، تقع أداة استشعار التقارب أسفل الشاشة، ما قد يؤدي إلى ظهور نقطة وامضة على الشاشة إذا تم تفعيلها أثناء تشغيل الشاشة.
يوضّح الرمز التالي كيفية استخدام أداة استشعار التقارب:
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var proximity: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val distance = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() proximity?.also { proximity -> sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL) } } override fun onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause() sensorManager.unregisterListener(this) } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor proximity; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
ملاحظة: تعرض بعض أدوات استشعار التقارب قيمًا ثنائية تمثّل
التقارب أو البُعد. في هذه الحالة، يعرض المستشعر عادةً قيمة الحد الأقصى للنطاق في الحالة البعيدة، وقيمة أقل في الحالة القريبة. عادةً، تكون القيمة البعيدة أكبر من 5 سم، ولكن يمكن أن تختلف من جهاز استشعار إلى آخر. يمكنك تحديد الحد الأقصى لنطاق المستشعر باستخدام الطريقة getMaximumRange()
.