سنسورهای موقعیت

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

توجه: سنسور جهت در Android 2.2 (سطح API 8) منسوخ شده است و نوع سنسور جهت در Android 4.4W (سطح API 20) منسوخ شده است.

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

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

جدول 1. سنسورهایی را که در پلتفرم اندروید پشتیبانی می شوند، قرار دهید.

سنسور داده های رویداد حسگر توضیحات واحدهای اندازه گیری
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] تخمین سوگیری آهن در امتداد محور x.
SensorEvent.values[4] تخمین سوگیری آهن در امتداد محور y.
SensorEvent.values[5] تخمین سوگیری آهن در امتداد محور z.
TYPE_ORIENTATION 1 SensorEvent.values[0] آزیموت (زاویه حول محور z). درجه
SensorEvent.values[1] گام (زاویه حول محور x).
SensorEvent.values[2] رول (زاویه حول محور y).
TYPE_PROXIMITY SensorEvent.values[0] فاصله از جسم 2 سانتی متر

1 این سنسور در اندروید 2.2 (سطح API 8) منسوخ شده است و این نوع سنسور در اندروید 4.4W (سطح API 20) منسوخ شده است. چارچوب حسگر روش‌های جایگزینی را برای دستیابی به جهت‌گیری دستگاه ارائه می‌کند که در محاسبه جهت‌گیری دستگاه مورد بحث قرار گرفته‌اند.

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

از سنسور بردار چرخش بازی استفاده کنید

سنسور بردار چرخش بازی با حسگر برداری چرخش یکسان است، با این تفاوت که از میدان ژئومغناطیسی استفاده نمی کند. بنابراین محور 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). این زاویه بین جهت قطب نمای فعلی دستگاه و شمال مغناطیسی است. اگر لبه بالایی دستگاه به سمت شمال مغناطیسی باشد، آزیموت 0 درجه است. اگر لبه بالایی به سمت جنوب باشد، آزیموت 180 درجه است. به همین ترتیب، اگر لبه بالایی رو به شرق باشد، آزیموت 90 درجه و اگر لبه بالایی رو به غرب باشد، سمتیموت 270 درجه است.
  • گام (درجه‌های چرخش حول محور x). این زاویه بین صفحه موازی صفحه دستگاه و صفحه موازی با زمین است. اگر دستگاه را به موازات زمین با لبه پایینی نزدیک به خود نگه دارید و لبه بالایی دستگاه را به سمت زمین کج کنید، زاویه گام مثبت می شود. کج شدن در جهت مخالف - دور کردن لبه بالایی دستگاه از زمین - باعث منفی شدن زاویه گام می شود. محدوده مقادیر -90 درجه تا 90 درجه است.
  • رول (درجات چرخش حول محور y). این زاویه بین صفحه عمود بر صفحه دستگاه و صفحه عمود بر زمین است. اگر دستگاه را به موازات زمین با لبه پایینی نزدیک به خود نگه دارید و لبه چپ دستگاه را به سمت زمین متمایل کنید، زاویه رول مثبت می شود. کج شدن در جهت مخالف - حرکت لبه سمت راست دستگاه به سمت زمین - باعث منفی شدن زاویه رول می شود. محدوده مقادیر -180 درجه تا 180 درجه است.

توجه: تعریف رول حسگر تغییر کرده است تا منعکس کننده اکثریت قریب به اتفاق اجراها در اکوسیستم ژئوسنسور باشد.

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

سنسور جهت گیری داده های خود را با پردازش داده های حسگر خام از شتاب سنج و حسگر میدان ژئومغناطیسی استخراج می کند. به دلیل پردازش سنگینی که درگیر است، دقت و دقت سنسور جهت یابی کاهش می یابد. به طور خاص، این سنسور فقط زمانی قابل اعتماد است که زاویه رول 0 باشد. در نتیجه، سنسور جهت در Android 2.2 (سطح API 8) منسوخ شد، و نوع سنسور جهت در Android 4.4W (سطح API 20) منسوخ شد. به‌جای استفاده از داده‌های خام از حسگر جهت‌یابی، توصیه می‌کنیم که از متد 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 (سطح API 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

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

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

کاتلین

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

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

شما هم باید مطالعه کنید