حسگرهای موقعیت

پلاتفرم Android دو حسگر ارائه می‌دهد که به شما امکان می‌دهد موقعیت دستگاه را تعیین کنید: حسگر میدان ژئومغناطیسی و شتاب‌سنج. پلاتفرم Android همچنین حسگری ارائه می‌دهد که به شما امکان می‌دهد تعیین کنید جلوی دستگاه چقدر به یک شیء نزدیک است (به‌عنوان حسگر مجاورت شناخته می‌شود). حسگر میدان ژئومغناطیسی و حسگر مجاورت مبتنی بر سخت‌افزار هستند. اکثر سازندگان گوشی و رایانه لوحی حسگر میدان ژئومغناطیسی را در دستگاه‌هایشان قرار می‌دهند. به‌همین ترتیب، سازندگان گوشی معمولاً حسگر مجاورت را برای تعیین زمانی که گوشی نزدیک صورت کاربر نگه داشته می‌شود (برای مثال، درطول تماس تلفنی) اضافه می‌کنند. برای تعیین جهت دستگاه، می‌توانید از خوانش‌های شتاب‌سنج دستگاه و حسگر میدان ژئومغناطیسی استفاده کنید.

توجه: حسگر جهت‌یابی در Android 2.2 (سطح میانای برنامه‌سازی کاربردی ۸) منسوخ شد و نوع حسگر جهت‌یابی در Android 4.4W (سطح میانای برنامه‌سازی کاربردی ۲۰) منسوخ شد.

حسگرهای موقعیت برای تعیین موقعیت فیزیکی دستگاه در چارچوب مرجع جهان مفید هستند. برای مثال، می‌توانید از حسگر میدان ژئومغناطیسی در ترکیب با شتاب‌سنج برای تعیین موقعیت دستگاه نسبت به قطب شمال مغناطیسی استفاده کنید. همچنین می‌توانید از این حسگرها برای تعیین جهت دستگاه در چارچوب مرجع برنامه‌تان استفاده کنید. حسگرهای موقعیت معمولاً برای پایش جابه‌جایی یا حرکت دستگاه، مثل لرزش، کج شدن، یا رانش استفاده نمی‌شوند (برای اطلاعات بیشتر، حسگرهای حرکتی را ببینید).

حسگر میدان ژئومغناطیسی و شتاب‌سنج آرایه‌های چندبعدی از مقادیر حسگر را برای هر SensorEvent برمی‌گردانند. برای مثال، حسگر میدان ژئومغناطیسی مقادیر قدرت میدان ژئومغناطیسی را برای هریک از سه محور مختصات درطول یک رویداد حسگر ارائه می‌دهد. به‌همین ترتیب، حسگر شتاب‌سنج شتاب اعمال‌شده به دستگاه را درطول رویداد حسگر اندازه‌گیری می‌کند. برای اطلاعات بیشتر درباره سیستم‌های مختصاتی که حسگرها استفاده می‌کنند، به سیستم‌های مختصات حسگر مراجعه کنید. حسگر مجاورت برای هر رویداد حسگر، یک مقدار واحد ارائه می‌دهد. جدول ۱ حسگرهای موقعیت را که در پلاتفرم Android پشتیبانی می‌شوند خلاصه می‌کند.

جدول ۱. حسگرهای موقعیت که در پلاتفرم 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. میکروتسلا
SensorEvent.values[1] قدرت میدان ژئومغناطیسی در امتداد محور y.
SensorEvent.values[2] قدرت میدان ژئومغناطیسی در امتداد محور z.
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] قدرت میدان ژئومغناطیسی (بدون واسنجی آهن سخت) در امتداد محور x. میکروتسلا
SensorEvent.values[1] قدرت میدان ژئومغناطیسی (بدون واسنجی آهن سخت) در امتداد محور y.
SensorEvent.values[2] قدرت میدان ژئومغناطیسی (بدون واسنجی آهن سخت) در امتداد محور z.
SensorEvent.values[3] تخمین سوگیری آهن در امتداد محور x.
SensorEvent.values[4] برآورد سوگیری آهن در امتداد محور y.
SensorEvent.values[5] تخمین سوگیری آهن در امتداد محور z.
TYPE_ORIENTATION۱ SensorEvent.values[0] سمت (زاویه حول محور z). درجه
SensorEvent.values[1] گام (زاویه حول محور x).
SensorEvent.values[2] چرخش (زاویه حول محور y).
TYPE_PROXIMITY SensorEvent.values[0] فاصله از شیء.۲ سانتی‌متر

۱این حسگر در Android 2.2 (سطح میانای برنامه‌سازی کاربردی ۸) منسوخ شد و این نوع حسگر در Android 4.4W (سطح میانای برنامه‌سازی کاربردی ۲۰) منسوخ شد. چارچوب حسگر روش‌های جایگزینی برای به‌دست آوردن جهت دستگاه ارائه می‌دهد که در محاسبه جهت دستگاه مورد بحث قرار گرفته است.

۲ برخی‌از حسگرهای مجاورت فقط مقادیر دودویی ارائه می‌دهند که نشان‌دهنده نزدیک و دور است.

استفاده از حسگر بردار چرخش بازی

حسگر بردار چرخش بازی با حسگر بردار چرخش یکسان است، با این تفاوت که از میدان ژئومغناطیسی استفاده نمی‌کند. بنابراین محور Y به شمال اشاره نمی‌کند، بلکه به مرجع دیگری اشاره می‌کند. این مرجع می‌تواند با همان مرتبه بزرگی که ژیروسکوپ حول محور Z منحرف می‌شود، منحرف شود.

چون حسگر بردار چرخش بازی از میدان مغناطیسی استفاده نمی‌کند، چرخش‌های نسبی دقیق‌تر هستند و تحت تأثیر تغییرات میدان مغناطیسی قرار نمی‌گیرند. اگر برایتان مهم نیست که شمال کجاست و بردار چرخش عادی به‌دلیل اتکایش به میدان مغناطیسی نیازهایتان را برآورده نمی‌کند، از این حسگر در بازی استفاده کنید.

کد زیر نحوه دریافت نمونه‌ای از حسگر بردار چرخش بازی پیش‌فرض را نشان می‌دهد:

کاتلین

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)

جاوا

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);

استفاده از حسگر بردار چرخش ژئومغناطیسی

حسگر بردار چرخش ژئومغناطیسی شبیه به حسگر بردار چرخش است، اما از ژیروسکوپ استفاده نمی‌کند. دقت این حسگر کمتر از حسگر بردار چرخش معمولی است، اما مصرف برق آن کاهش یافته است. فقط درصورتی از این حسگر استفاده کنید که می‌خواهید اطلاعات چرخش را در پس‌زمینه بدون مصرف زیاد باتری جمع‌آوری کنید. این حسگر زمانی بیشترین کاربرد را دارد که همراه با دسته‌بندی استفاده شود.

کد زیر نحوه دریافت نمونه‌ای از حسگر بردار چرخش ژئومغناطیسی پیش‌فرض را نشان می‌دهد:

کاتلین

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)

جاوا

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);

محاسبه جهت دستگاه

با محاسبه جهت دستگاه، می‌توانید موقعیت دستگاه را نسبت به چارچوب مرجع زمین (به‌ویژه قطب شمال مغناطیسی) نظارت کنید. کد زیر نحوه محاسبه جهت دستگاه را نشان می‌دهد:

کاتلین

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)

جاوا

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-). این زاویه بین جهت فعلی قطب‌نمای دستگاه و شمال مغناطیسی است. اگر لبه بالایی دستگاه رو به شمال مغناطیسی باشد، زاویه سمتی ۰ درجه است؛ اگر لبه بالایی رو به جنوب باشد، زاویه سمتی ۱۸۰ درجه است. به‌طور مشابه، اگر لبه بالایی به‌سمت شرق باشد، زاویه سمتی ۹۰ درجه است، و اگر لبه بالایی به‌سمت غرب باشد، زاویه سمتی ۲۷۰ درجه است.
  • زاویه چرخش (درجه چرخش حول محور x). این زاویه بین صفحه‌ای موازی با صفحه‌نمایش دستگاه و صفحه‌ای موازی با زمین است. اگر دستگاه را موازی با زمین نگه دارید به‌طوری‌که لبه پایینی به شما نزدیک‌تر باشد و لبه بالایی دستگاه را به‌سمت زمین کج کنید، زاویه گام مثبت می‌شود. کج کردن در جهت مخالف— دور کردن لبه بالایی دستگاه از زمین—باعث می‌شود زاویه گام منفی شود. محدوده مقادیر از ۹۰- درجه تا ۹۰ درجه است.
  • چرخش (درجه چرخش حول محور y). این زاویه بین صفحه‌ای عمود بر صفحه‌نمایش دستگاه و صفحه‌ای عمود بر زمین است. اگر دستگاه را موازی با زمین نگه دارید به‌طوری‌که لبه پایینی نزدیک‌ترین لبه به شما باشد و لبه چپ دستگاه را به‌سمت زمین کج کنید، زاویه چرخش مثبت می‌شود. کج کردن در جهت مخالف—حرکت دادن لبه راست دستگاه به‌سمت زمین—باعث می‌شود زاویه چرخش منفی شود. محدوده مقادیر از ۱۸۰- درجه تا ۱۸۰ درجه است.

توجه:تعریف چرخش حسگر تغییر کرده است تا اکثر پیاده‌سازی‌ها در بوم‌سازگان حسگر جغرافیایی را منعکس کند.

توجه داشته باشید که این زاویه‌ها از سیستم مختصات متفاوتی نسبت به سیستم مختصات مورداستفاده در هوانوردی (برای انحراف، گام، و چرخش) استفاده می‌کنند. در سیستم هوانوردی، محور x در امتداد سمت بلند هواپیما، از دم تا دماغه است.

حسگر جهت‌یابی داده‌هایش را با پردازش داده‌های خام حسگر از شتاب‌سنج و حسگر میدان ژئومغناطیسی به‌دست می‌آورد. به‌دلیل پردازش سنگینی که انجام می‌شود، دقت و صحت حسگر جهت‌یابی کاهش می‌یابد. به‌طور خاص، این حسگر فقط زمانی قابل‌اعتماد است که زاویه چرخش ۰ باشد. درنتیجه، حسگر جهت‌یابی در Android نسخه ۲.۲ (سطح میانای برنامه‌سازی کاربردی ۸) منسوخ شد و نوع حسگر جهت‌یابی در Android نسخه ۴.۴W (سطح میانای برنامه‌سازی کاربردی ۲۰) منسوخ شد. توصیه می‌کنیم به‌جای استفاده از داده‌های خام حسگر جهت‌یابی، از روش getRotationMatrix() در ترکیب با روش getOrientation() برای محاسبه مقادیر جهت‌یابی استفاده کنید، همان‌طور که در نمونه کد زیر نشان داده شده است. به‌عنوان بخشی از این فرایند، می‌توانید از روش remapCoordinateSystem() برای ترجمه مقادیر جهت‌یابی به چارچوب مرجع برنامه‌تان استفاده کنید.

کاتلین

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

جاوا

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

معمولاً نیازی به انجام پردازش یا فیلتر کردن داده‌ها برای زاویه‌های جهت‌یابی خام دستگاه ندارید، به‌جز ترجمه سیستم مختصات حسگر به چارچوب مرجع برنامه‌تان.

استفاده از حسگر میدان مغناطیسی زمین

حسگر میدان ژئومغناطیسی به شما امکان می‌دهد تغییرات میدان مغناطیسی زمین را پایش کنید. کد زیر نحوه دریافت نمونه‌ای از حسگر میدان ژئومغناطیسی پیش‌فرض را نشان می‌دهد:

کاتلین

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)

جاوا

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

توجه: اگر برنامه شما Android 12 (سطح میانای برنامه‌سازی کاربردی ۳۱) یا بالاتر را هدف قرار دهد، این حسگر محدودیت نرخ دارد.

این حسگر داده‌های خام قدرت میدان (برحسب میکروتسلا) را برای هریک از سه محور مختصات ارائه می‌دهد. معمولاً نیازی نیست مستقیماً از این حسگر استفاده کنید. درعوض، می‌توانید از حسگر بردار چرخش برای تعیین حرکت چرخشی خام استفاده کنید یا می‌توانید از حسگر شتاب‌سنج و میدان ژئومغناطیسی همراه با روش getRotationMatrix() برای به‌دست آوردن ماتریس چرخش و ماتریس شیب استفاده کنید. سپس می‌توانید از این ماتریس‌ها با روش‌های getOrientation() و getInclination() برای دریافت داده‌های زاویه سمتی و انحراف ژئومغناطیسی استفاده کنید.

توجه: هنگام آزمایش برنامه، می‌توانید با تکان دادن دستگاه به‌شکل عدد ۸، دقت حسگر را بهبود ببخشید.

استفاده از مغناطیس‌سنج واسنجی‌نشده

مغناطیس‌سنج واسنجی‌نشده شبیه حسگر میدان ژئومغناطیسی است، با این تفاوت که هیچ واسنجی آهن سختی روی میدان مغناطیسی اعمال نمی‌شود. واسنجی کارخانه‌ای و جبران دما همچنان بر میدان مغناطیسی اعمال می‌شود. مغناطیس‌سنج کالیبره‌نشده برای مدیریت تخمین‌های بد آهن سخت مفید است. به‌طور کلی، geomagneticsensor_event.values[0] به uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3] نزدیک خواهد بود. یعنی،

calibrated_x ~= uncalibrated_x - bias_estimate_x

توجه: حسگرهای واسنجی‌نشده نتایج خام‌تری ارائه می‌دهند و ممکن است شامل برخی سوگیری‌ها باشند، اما اندازه‌گیری‌های آن‌ها شامل پرش‌های کمتری از اصلاحات اعمال‌شده ازطریق واسنجی است. برخی‌از برنامه‌ها ممکن است این نتایج واسنجی‌نشده را به‌عنوان نتایج روان‌تر و قابل‌اعتمادتر ترجیح دهند. برای مثال، اگر برنامه‌ای در تلاش است تا ادغام حسگر خود را انجام دهد، معرفی کالیبراسیون‌ها می‌تواند درواقع نتایج را تحریف کند.

مغناطیس‌سنج واسنجی‌نشده علاوه‌بر میدان مغناطیسی، سوگیری آهن سخت تخمینی را نیز در هر محور ارائه می‌دهد. کد زیر نحوه دریافت نمونه‌ای از مغناطیس‌سنج واسنجی‌نشده پیش‌فرض را نشان می‌دهد:

کاتلین

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)

جاوا

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);

استفاده از حسگر مجاورت

حسگر مجاورت به شما امکان می‌دهد فاصله شیء را از دستگاه تعیین کنید. کد زیر نحوه دریافت نمونه‌ای از حسگر مجاورت پیش‌فرض را نشان می‌دهد:

کاتلین

private lateinit var sensorManager: SensorManager
private var sensor: Sensor? = null
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)

جاوا

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

حسگر مجاورت معمولاً برای تعیین فاصله سر فرد از صفحه دستگاه گوشی استفاده می‌شود (برای مثال، وقتی کاربر درحال برقراری یا دریافت تماس تلفنی است). اکثر حسگرهای مجاورت فاصله مطلق را برحسب سانتی‌متر برمی‌گردانند، اما برخی فقط مقادیر نزدیک و دور را برمی‌گردانند.

توجه: در برخی‌از مدل‌های دستگاه، حسگر مجاورت در زیر صفحه‌نمایش قرار دارد که اگر درحین روشن بودن صفحه‌نمایش فعال شود، می‌تواند باعث ظاهر شدن نقطه‌ای چشمک‌زن روی صفحه‌نمایش شود.

کد زیر نحوه استفاده از حسگر مجاورت را نشان می‌دهد:

کاتلین

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

جاوا

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

توجه: برخی‌از حسگرهای مجاورت مقادیر دودویی برمی‌گردانند که نشان‌دهنده «نزدیک» یا «دور» است. در این حالت، حسگر معمولاً مقدار حداکثر محدوده خود را در حالت دور و مقدار کمتری را در حالت نزدیک گزارش می‌کند. معمولاً مقدار دور مقداری بیشتر از ۵ سانتی‌متر است، اما این مقدار می‌تواند از حسگری به حسگر دیگر متفاوت باشد. می‌توانید حداکثر محدوده حسگر را بااستفاده از روش getMaximumRange() تعیین کنید.

همچنین باید این موارد را بخوانید