أجهزة استشعار الموضع

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

ملاحظة: تم إيقاف أداة استشعار الاتجاه نهائيًا في الإصدار 2.2 من Android. (المستوى 8 من واجهة برمجة التطبيقات)، وتم إيقاف نوع أداة استشعار الاتجاه نهائيًا في الإصدار 4.4W من نظام التشغيل Android (المستوى 20 من واجهة برمجة التطبيقات)

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

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

الجدول 1. أدوات استشعار الموضع المتاحة على نظام Android الأساسي

أداة استشعار بيانات أحداث أداة الاستشعار الوصف وحدات القياس
TYPE_GAME_ROTATION_VECTOR SensorEvent.values[0] مكوّن متجه التدوير على طول المحور x (x * sin(الوارد/2)). بلا وحدة
SensorEvent.values[1] مكوّن متجه الدوران على طول المحور ص (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 * sin(الوارد/2)).
SensorEvent.values[2] مكوّن متجه التدوير على طول المحور z (z * sin(الوارد/2)).
TYPE_MAGNETIC_FIELD SensorEvent.values[0] شدة المجال المغناطيسي الأرضي على طول المحور س. ميكرو طن
SensorEvent.values[1] شدة المجال المغناطيسي الأرضي على طول المحور ص.
SensorEvent.values[2] شدة المجال المغناطيسي الأرضي على طول المحور z.
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] شدة المجال المغناطيسي الأرضي (بدون معايرة الحديد الصلب) على طول المحور س. ميكرو طن
SensorEvent.values[1] شدة المجال المغناطيسي الأرضي (بدون معايرة الحديد الصلب) على طول المحور ص.
SensorEvent.values[2] شدة المجال المغناطيسي الأرضي (بدون معايرة الحديد الصلب) على طول المحور z.
SensorEvent.values[3] تقدير تحيز الحديد على طول المحور س.
SensorEvent.values[4] تقدير تحيز الحديد على طول المحور ص.
SensorEvent.values[5] تقدير تحيز الحديد على طول المحور z.
TYPE_ORIENTATION1 SensorEvent.values[0] السمت (زاوية حول المحور z). الدرجات
SensorEvent.values[1] درجة الصوت (الزاوية حول المحور x).
SensorEvent.values[2] اللفة (الزاوية حول المحور y).
TYPE_PROXIMITY SensorEvent.values[0] المسافة من العنصر2 سم

1تم إيقاف أداة الاستشعار هذه نهائيًا في الإصدار 2.2 من نظام التشغيل Android (واجهة برمجة التطبيقات). المستوى 8)، وتم إيقاف نوع أداة الاستشعار هذا في Android 4.4W (مستوى واجهة برمجة التطبيقات 20). يوفّر إطار عمل أداة الاستشعار طرقًا بديلة للحصول على الجهاز. الاتجاه الذي تمت مناقشته في الحوسبة اتجاه الجهاز.

2 لا توفّر بعض أدوات استشعار التقارب سوى قيمًا ثنائية فقط. تمثل القريب والبعيد.

استخدام أداة استشعار اتجاه الدوران في اللعبة

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

ملاحظة:تم تغيير تعريف لفة جهاز الاستشعار لتعكس الغالبية العظمى من عمليات التنفيذ في نظام أجهزة الاستشعار الجغرافية.

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

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

ملاحظة: إذا كان تطبيقك يستهدف Android 12 (المستوى 31 من واجهة برمجة التطبيقات) أو أعلى، فهذا المستشعر معدّل محدود:

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

يجب عليك أيضًا قراءة