Konum sensörleri

Android platformu, cihazların konumunu belirlemenizi sağlayan iki sensör sağlar: jeomanyetik alan sensörü ve ivme ölçer. Android platformu, cihaz yüzeyinin bir nesneye ne kadar yakın olduğunu belirlemenizi sağlayan bir sensör de (yakınlık sensörü olarak bilinir) sağlar. Jeomanyetik alan sensörü ve yakınlık sensörü donanım tabanlıdır. Çoğu telefon ve tablet üreticisi, bir jeomanyetik alan sensörü içerir. Benzer şekilde, telefon üreticileri genellikle telefonun kullanıcının yüzüne yakın tutulduğunu (örneğin, telefon görüşmesi sırasında) belirlemek için bir yakınlık sensörü eklerler. Cihazın yönünü belirlemek için cihazın ivme ölçerinden ve jeomanyetik alan sensöründen elde edilen değerleri kullanabilirsiniz.

Not: Yön sensörü desteği Android 2.2'de (API seviyesi 8) ve yön sensörü türü Android 4.4W'ta (API düzeyi 20) kullanımdan kaldırılmıştır.

Konum sensörleri, bir cihazın dünyanın referans çerçevesindeki fiziksel konumunu belirlemek için kullanışlıdır. Örneğin, cihazın manyetik kuzey kutbuna göre konumunu belirlemek için jeomanyetik alan sensörünü ivme ölçerle birlikte kullanabilirsiniz. Bu sensörleri, uygulamanızın referans çerçevesinde bir cihazın yönünü belirlemek için de kullanabilirsiniz. Konum sensörleri genellikle cihaz hareketini veya sallama, eğme veya itme gibi hareketlerini izlemek için kullanılmaz (daha fazla bilgi için Hareket sensörleri bölümüne bakın).

Jeomanyetik alan sensörü ve ivme ölçer, her bir SensorEvent için sensör değerlerinden oluşan çok boyutlu diziler döndürür. Örneğin, jeomanyetik alan sensörü, tek bir sensör olayı sırasında üç koordinat ekseninin her biri için jeomanyetik alan gücü değerleri sağlar. Benzer şekilde, ivme ölçer sensörü de bir sensör olayı sırasında cihaza uygulanan ivmeyi ölçer. Sensörler tarafından kullanılan koordinat sistemleri hakkında daha fazla bilgi için Sensör koordinat sistemleri bölümüne bakın. Yakınlık sensörü, her sensör etkinliği için tek bir değer sağlar. Tablo 1'de Android platformunda desteklenen konum sensörleri özetlenmiştir.

Tablo 1. Android platformunda desteklenen konum sensörleri.

Sensör Sensör etkinlik verileri Açıklama Ölçü birimleri
TYPE_GAME_ROTATION_VECTOR SensorEvent.values[0] x ekseni boyunca döndürme vektör bileşeni (x * sin(θ/2)). Birimsiz
SensorEvent.values[1] Y ekseni boyunca rotasyon vektör bileşeni (y * sin(θ/2)).
SensorEvent.values[2] Z ekseni boyunca rotasyon vektör bileşeni (z * sin(θ/2)).
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] x ekseni boyunca döndürme vektör bileşeni (x * sin(θ/2)). Birimsiz
SensorEvent.values[1] Y ekseni boyunca rotasyon vektör bileşeni (y * sin(θ/2)).
SensorEvent.values[2] Z ekseni boyunca rotasyon vektör bileşeni (z * sin(θ/2)).
TYPE_MAGNETIC_FIELD SensorEvent.values[0] X eksenindeki jeomanyetik alan gücü. μT
SensorEvent.values[1] Y eksenindeki jeomanyetik alan gücü.
SensorEvent.values[2] Z ekseni boyunca jeomanyetik alan gücü.
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] x ekseni boyunca jeomanyetik alan gücü (sabit demir kalibrasyon olmadan). μT
SensorEvent.values[1] Y ekseni boyunca (sert demir kalibrasyon olmadan) jeomanyetik alan gücü.
SensorEvent.values[2] Z ekseni boyunca (sert demir kalibrasyon olmadan) jeomanyetik alan gücü.
SensorEvent.values[3] X ekseni boyunca demir yanlılık tahmini.
SensorEvent.values[4] Y ekseni boyunca demir yanlılık tahmini.
SensorEvent.values[5] Z ekseni boyunca demir yanlılık tahmini.
TYPE_ORIENTATION1 SensorEvent.values[0] Azimut (z ekseni etrafındaki açı). Derece
SensorEvent.values[1] Eğim (x ekseni etrafındaki açı).
SensorEvent.values[2] Yuvarlama (y ekseni etrafındaki açı).
TYPE_PROXIMITY SensorEvent.values[0] Nesneye olan mesafe.2 cm

1Bu sensör Android 2.2'de (API seviyesi 8) kullanımdan kaldırılmış ve bu sensör türü Android 4.4W (API düzeyi 20) sürümünde kullanımdan kaldırılmıştır. Sensör çerçevesi, cihaz yönünü edinmek için alternatif yöntemler sağlar. Bu yöntemler, Cihazın yönünü hesaplama bölümünde ele alınmaktadır.

2 Bazı yakınlık sensörleri yalnızca yakın ve uzaklığı temsil eden ikili değerler sağlar.

Oyun döndürme vektör sensörünü kullanma

Oyun dönüşü vektör sensörü, jeomanyetik alanı kullanmaması dışında Rotasyon vektör sensörüyle aynıdır. Bu nedenle, Y ekseni kuzeyi değil, başka bir referansı gösterir. Bu referansın, jiroskop Z ekseni etrafında hareket ederken aynı büyüklük sırasına göre kaymasına izin verilir.

Oyun dönüşü vektör sensörü manyetik alanı kullanmadığı için göreceli dönüşler daha doğru olur ve manyetik alan değişimlerinden etkilenmez. Kuzeyin nerede olduğu sizin için önemli değilse ve manyetik alana dayalı olduğundan normal dönüş vektörü ihtiyaçlarınıza uymuyorsa bu sensörü bir oyunda kullanın.

Aşağıdaki kod, varsayılan oyun rotasyonu vektör sensörünün bir örneğini nasıl alacağınızı göstermektedir:

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

Jeomanyetik dönüş vektör sensörünü kullanma

Jeomanyetik dönüş vektör sensörü, dönme vektör sensörüne benzer ancak jiroskopu kullanmaz. Bu sensörün doğruluğu normal dönüş vektör sensöründen düşük olsa da güç tüketimi azalır. Bu sensörü yalnızca çok fazla pil kullanmadan arka planda döndürme bilgilerini toplamak istiyorsanız kullanın. Bu sensör en çok toplu işlemeyle birlikte kullanıldığında işe yarar.

Aşağıdaki kod, varsayılan jeomanyetik dönüş vektör sensörünün bir örneğini nasıl alacağınızı göstermektedir:

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

Cihazın yönünü hesaplayın

Bir cihazın yönünü hesaplayarak cihazın, dünyanın referans çerçevesine (özellikle manyetik kuzey kutbuna) göre konumunu izleyebilirsiniz. Aşağıdaki kod, bir cihazın yönünün nasıl hesaplanacağını gösterir:

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

Sistem, yön açılarını cihazın ivme ölçeriyle birlikte cihazın jeomanyetik alan sensörünü kullanarak hesaplar. Sistem bu iki donanım sensörünü kullanarak aşağıdaki üç yön açısı için veri sağlar:

  • Azimut (-z ekseni etrafında dönme derecesi). Bu, cihazın mevcut pusula yönü ile manyetik kuzey arasındaki açıdır. Cihazın üst kenarı manyetik kuzeye bakıyorsa azimut 0 derece, üst kenar güneye dönükse azimut 180 derecedir. Benzer şekilde, üst kenar doğuya bakıyorsa azimut 90 derece, üst kenar batıya bakıyorsa azimut 270 derecedir.
  • Eğim (x ekseni etrafındaki döndürme dereceleri). Bu, cihazın ekranına paralel bir düzlem ile yere paralel bir düzlem arasındaki açıdır. Cihazı, alt kenarı size en yakın olacak şekilde yere paralel tutar ve cihazın üst kenarını yere doğru eğerseniz dönüş açısı pozitif hale gelir. Ters yönde yatırmak (cihazın üst kenarını yerden uzağa taşımak) eğim açısının negatif olmasına neden olur. Değer aralığı -90 derece ile 90 derece arasındadır.
  • Yuvarla (y ekseni etrafında dönme derecesi). Bu, cihaz ekranına dik bir düzlem ile yere dik bir düzlem arasındaki açıdır. Alt kenarı size en yakın olacak şekilde cihazı yere paralel tutarsanız ve cihazın sol kenarını yere doğru eğerseniz yuvarlama açısı pozitif hale gelir. Ters yönde yatırmak (cihazın sağ kenarını yere doğru hareket ettirmek) yuvarlama açısının negatif olmasına neden olur. Değer aralığı -180 derece ile 180 derece arasındadır.

Not: Sensörün yuvarlanma tanımı, yer sensör ekosistemindeki uygulamaların büyük çoğunluğunu yansıtacak şekilde değiştirildi.

Bu açıların, havacılıkta kullanılandan farklı bir koordinat sisteminden (sapma, eğim ve yuvarlanma için) kullanıldığına dikkat edin. Havacılık sisteminde x ekseni, uçağın uzun kenarı boyunca, kuyruktan buruna kadardır.

Oryantasyon sensörü, verilerini ivme ölçer ve jeomanyetik alan sensöründen gelen ham sensör verilerini işleyerek elde eder. İşlemin ağır olması nedeniyle yön sensörünün doğruluğu ve hassasiyeti azalır. Özellikle, bu sensör yalnızca yuvarlama açısı 0 olduğunda güvenilirdir. Bunun sonucunda, yön sensörü Android 2.2'de (API seviyesi 8) kullanımdan kaldırıldı ve Android 4.4W (API düzeyi 20) sürümünde yön sensörü türü kullanımdan kaldırıldı. Yön sensöründen alınan ham verileri kullanmak yerine, aşağıdaki kod örneğinde gösterildiği gibi yön değerlerini hesaplamak için getRotationMatrix() yöntemini getOrientation() yöntemiyle birlikte kullanmanızı öneririz. Bu süreç kapsamında, yön değerlerini uygulamanızın referans çerçevesine çevirmek için remapCoordinateSystem() yöntemini kullanabilirsiniz.

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

Sensörün koordinat sistemini uygulamanızın referans çerçevesine çevirmek dışında, genellikle cihazın ham yön açıları için herhangi bir veri işleme veya filtreleme işlemi yapmanız gerekmez.

Jeomanyetik alan sensörünü kullanma

Jeomanyetik alan sensörü, dünyanın manyetik alanındaki değişiklikleri izlemenize olanak tanır. Aşağıdaki kod, varsayılan jeomanyetik alan sensörünün bir örneğini nasıl alacağınızı göstermektedir:

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

Not: Uygulamanız Android 12 (API düzeyi 31) veya daha üst sürümleri hedefliyorsa bu sensör hız sınırlandırılır.

Bu sensör, üç koordinat ekseninin her biri için ham alan gücü verileri (μT cinsinden) sağlar. Genellikle bu sensörü doğrudan kullanmanız gerekmez. Bunun yerine, ham dönme hareketini belirlemek için döndürme vektör sensörünü veya döndürme matrisini ve eğim matrisini elde etmek için getRotationMatrix() yöntemiyle birlikte ivme ölçeri ve jeomanyetik alan sensörünü kullanabilirsiniz. Ardından bu matrisleri, azimut ve jeomanyetik eğim verilerini elde etmek için getOrientation() ve getInclination() yöntemleriyle kullanabilirsiniz.

Not: Uygulamanızı test ederken cihazı 8 şeklinde sallayarak sensörün doğruluğunu artırabilirsiniz.

Kalibre edilmemiş manyetometreyi kullanın

Kalibre edilmemiş manyetometre, manyetik alana sert demir kalibrasyonunun uygulanmaması dışında jeomanyetik alan sensörüne benzer. Manyetik alana fabrika kalibrasyonu ve sıcaklık telafisi uygulanmaya devam eder. Kalibre edilmemiş manyetometre, kötü sert demir tahminlerini ele almak için kullanışlıdır. Genel olarak, geomagneticsensor_event.values[0] uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3] değerine yakın olacaktır. Yani,

calibrated_x ~= uncalibrated_x - bias_estimate_x

Not: Kalibre edilmemiş sensörler daha ham sonuçlar sağlar ve bazı sapmalar içerebilir ancak bu sensörlerin ölçümleri kalibrasyon yoluyla uygulanan düzeltmelerden daha az atlama içerir. Bazı uygulamalar bu kalibre edilmemiş sonuçların daha düzgün ve güvenilir olmasını tercih edebilir. Örneğin, bir uygulama kendi sensör füzyonunu yürütmeye çalışıyorsa kalibrasyon eklemek aslında sonuçları bozabilir.

Manyetik alanın yanı sıra, kalibre edilmemiş manyetometre, her eksende tahmini sabit demir eğim değerini de sağlar. Aşağıdaki kod, varsayılan kalibre edilmemiş manyetometre örneğinin nasıl alınacağını gösterir:

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

Yakınlık sensörünü kullanma

Yakınlık sensörü, nesnenin cihazdan ne kadar uzakta olduğunu belirlemenizi sağlar. Aşağıdaki kod, varsayılan yakınlık sensörünün bir örneğini nasıl alacağınızı gösterir:

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

Yakınlık sensörü genellikle bir kişinin kafasının mobil cihazın yüzüne ne kadar uzakta olduğunu belirlemek için kullanılır (örneğin, kullanıcı telefon ederken veya telefon ederken). Çoğu yakınlık sensörü, mutlak mesafeyi cm cinsinden döndürür, ancak bazıları yalnızca yakın ve uzak değerleri döndürür.

Not: Bazı cihaz modellerinde yakınlık sensörü ekranın altında bulunur. Bu durum, ekran açıkken etkinleştirilirse ekranda yanıp sönen bir noktanın görünmesine neden olabilir.

Aşağıdaki kod yakınlık sensörünün nasıl kullanılacağını gösterir:

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

Not: Bazı yakınlık sensörleri "yakın" veya "uzak"ı temsil eden ikili değerler döndürür. Bu durumda sensör genellikle uzak durumda maksimum aralık değerini, yakın durumda ise daha düşük bir değer bildirir. Uzak değer genellikle 5 cm'den büyük bir değerdir ancak bu değer sensörden sensöre değişebilir. getMaximumRange() yöntemini kullanarak bir sensörün maksimum menzilini belirleyebilirsiniz.

Ayrıca şunu da okumalısınız: