Konum sensörleri

Android platformu, bir cihazın konumunu belirlemenize olanak tanıyan iki sensör sağlar: jeomanyetik alan sensörü ve ivme ölçer. Android platformu, bir cihazın yüzünün 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, cihazlarına jeomanyetik alan sensörü ekler. Benzer şekilde, telefon üreticileri genellikle telefonun kullanıcının yüzüne ne zaman yaklaştırıldığını (ör. telefon görüşmesi sırasında) belirlemek için bir yakınlık sensörü ekler. Cihazın yönünü belirlemek için cihazın ivme ölçerinden ve jeomanyetik alan sensöründen gelen değerleri kullanabilirsiniz.

Not: Yön sensörü Android 2.2'de (API düzeyi 8), yön sensörü türü ise Android 4.4W'de (API düzeyi 20) kullanımdan kaldırılmıştır.

Konum sensörleri, bir cihazın dünya referans çerçevesindeki fiziksel konumunu belirlemek için kullanışlıdır. Örneğin, bir 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ın hareketini (ör. sallama, eğme veya itme) 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 SensorEvent için sensör değerlerinin çok boyutlu dizilerini döndürür. Örneğin, jeomanyetik alan sensörü, tek bir sensör etkinliği sırasında üç koordinat ekseninin her biri için jeomanyetik alan gücü değerleri sağlar. Benzer şekilde, ivme ölçer sensörü, bir sensör etkinliği 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 başlıklı makaleyi inceleyin. 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 etkinliği verileri Açıklama Ölçü birimleri
TYPE_GAME_ROTATION_VECTOR SensorEvent.values[0] X ekseni boyunca dönüş vektörü bileşeni (x * sin(θ/2)). Birim yok
SensorEvent.values[1] Y ekseni boyunca dönüş vektörü bileşeni (y * sin(θ/2)).
SensorEvent.values[2] Z ekseni boyunca dönüş vektörü bileşeni (z * sin(θ/2)).
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] X ekseni boyunca dönüş vektörü bileşeni (x * sin(θ/2)). Birim yok
SensorEvent.values[1] Y ekseni boyunca dönüş vektörü bileşeni (y * sin(θ/2)).
SensorEvent.values[2] Z ekseni boyunca dönüş vektörü bileşeni (z * sin(θ/2)).
TYPE_MAGNETIC_FIELD SensorEvent.values[0] X ekseni boyunca jeomanyetik alan gücü. μT
SensorEvent.values[1] Y ekseni boyunca 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ü (sert demir kalibrasyonu olmadan). μT
SensorEvent.values[1] Y ekseni boyunca jeomanyetik alan gücü (sert demir kalibrasyonu olmadan).
SensorEvent.values[2] Z ekseni boyunca jeomanyetik alan gücü (sert demir kalibrasyonu olmadan).
SensorEvent.values[3] X ekseni boyunca demir sapma tahmini.
SensorEvent.values[4] Y ekseni boyunca demir sapma tahmini.
SensorEvent.values[5] Z ekseni boyunca demir sapma 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] Yalpalama (Y ekseni etrafındaki açı).
TYPE_PROXIMITY SensorEvent.values[0] Nesneye olan mesafe.2 cm

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

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

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

Oyun dönüş vektörü sensörü, jeomanyetik alanı kullanmaması dışında dönüş vektörü sensörü ile aynıdır. Bu nedenle Y ekseni kuzeyi değil, başka bir referansı gösterir. Bu referansın, jiroskopun Z ekseni etrafında kaydığı büyüklükte kaymasına izin verilir.

Oyun dönüş vektörü sensörü manyetik alanı kullanmadığından göreli dönüşler daha doğrudur ve manyetik alan değişikliklerinden etkilenmez. Kuzeyin nerede olduğu sizin için önemli değilse ve normal dönüş vektörü, manyetik alana bağlı olması nedeniyle ihtiyaçlarınızı karşılamıyorsa bu sensörü bir oyunda kullanın.

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

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önüş vektörü sensörüne benzer ancak jiroskop kullanmaz. Bu sensörün doğruluğu normal rotasyon vektörü sensöründen daha düşüktür ancak güç tüketimi daha azdır. Bu sensörü yalnızca arka planda çok fazla pil kullanmadan dönüş bilgilerini toplamak istiyorsanız kullanın. Bu sensör, toplu işleme ile birlikte kullanıldığında en faydalı olur.

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

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ü hesaplama

Bir cihazın yönünü hesaplayarak cihazın Dünya'nın referans çerçevesine (özellikle manyetik kuzey kutbu) göre konumunu izleyebilirsiniz. Aşağıdaki kodda, cihazın yönünün nasıl hesaplanacağı gösterilmektedir:

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, cihazın jeomanyetik alan sensörünü cihazın ivme ölçeriyle birlikte kullanarak yön açılarını hesaplar. Sistem, bu iki donanım sensörünü kullanarak aşağıdaki üç yönlendirme açısı için veri sağlar:

  • Azimut (-z ekseni etrafındaki dönüş 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 derecedir; üst kenar güneye bakıyorsa azimut 180 derecedir. Benzer şekilde, üst kenar doğuya bakıyorsa azimut 90 derece, batıya bakıyorsa 270 derecedir.
  • Eğim (X ekseni etrafında dönüş derecesi). 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 eğim açısı pozitif olur. Tersi yönde eğme (cihazın üst kenarını yerden uzaklaştırma) ise eğim açısının negatif olmasına neden olur. Değer aralığı -90 derece ile 90 derece arasındadır.
  • Yalpalama (Y ekseni etrafındaki dönüş derecesi). Bu, cihazın ekranına dik olan düzlem ile yere dik olan düzlem arasındaki açıdır. Cihazı, alt kenarı size en yakın olacak şekilde yere paralel tutar ve cihazın sol kenarını yere doğru eğerseniz yalpalama açısı pozitif olur. Tersi yönde eğildiğinde (cihazın sağ kenarı yere doğru hareket ettirildiğinde) yalpalama açısı negatif olur. Değer aralığı -180 derece ile 180 derece arasındadır.

Not: Sensörün yalpalama tanımı, coğrafi 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ılan koordinat sisteminden (sapma, eğim ve yuvarlanma için) farklı bir koordinat sisteminde çalıştığını unutmayın. Havacılık sisteminde x ekseni, uçağın uzun tarafı boyunca kuyruktan buruna doğru uzanır.

Yön sensörü, ivme ölçer ve jeomanyetik alan sensöründen gelen ham sensör verilerini işleyerek verilerini elde eder. Yoğun işlem gücü gerektirdiğinden yön sensörünün doğruluğu ve hassasiyeti azalır. Özellikle bu sensör yalnızca yuvarlanma açısı 0 olduğunda güvenilirdir. Bu nedenle, yön sensörü Android 2.2'de (API düzeyi 8) ve yön sensörü türü Android 4.4W'de (API düzeyi 20) kullanımdan kaldırılmıştır. Yön sensöründen gelen 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 işlemin bir parçası olarak, 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.
    }
}

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

Jeomanyetik alan sensörünü kullanma

Jeomanyetik alan sensörü, Dünya'nın manyetik alanındaki değişiklikleri izlemenize olanak tanır. Aşağıdaki kodda, varsayılan jeomanyetik alan sensörünün bir örneğini nasıl alacağınız gösterilmektedir:

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 yeni bir sürümü hedefliyorsa bu sensör sıklık sınırlamasına tabidir.

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önme vektörü sensörünü kullanabilir veya dönme matrisi ile eğim matrisini elde etmek için ivme ölçer ve jeomanyetik alan sensörünü getRotationMatrix() yöntemiyle birlikte kullanabilirsiniz. Ardından bu matrisleri getOrientation() ve getInclination() yöntemleriyle kullanarak azimut ve jeomanyetik eğim verilerini elde edebilirsiniz.

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

Kalibre edilmemiş manyetometreyi kullanma

Kalibre edilmemiş manyetometre, manyetik alana sert demir kalibrasyonu uygulanmaması dışında jeomanyetik alan sensörüne benzer. Fabrika kalibrasyonu ve sıcaklık dengeleme, manyetik alana uygulanmaya devam eder. Kalibre edilmemiş manyetometre, kötü sert demir tahminlerini işlemek 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 ölçümlerinde kalibrasyon yoluyla uygulanan düzeltmelerden kaynaklanan daha az sıçrama olur. Bazı uygulamalar, bu kalibre edilmemiş sonuçları daha sorunsuz ve güvenilir olduğu için tercih edebilir. Örneğin, bir uygulama kendi sensör füzyonunu yapmaya çalışıyorsa kalibrasyonların eklenmesi sonuçları bozabilir.

Kalibre edilmemiş manyetometre, manyetik alanın yanı sıra her eksendeki tahmini sert demir sapmasını da sağlar. Aşağıdaki kodda, varsayılan kalibre edilmemiş manyetometrenin bir örneğinin nasıl alınacağı gösterilmektedir:

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ü, bir nesnenin cihaza ne kadar uzaklıkta olduğunu belirlemenize olanak tanır. Aşağıdaki kodda, varsayılan yakınlık sensörünün bir örneğini nasıl alacağınız gösterilmektedir:

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 başının, mobil cihazın ön yüzüne ne kadar uzaklıkta olduğunu belirlemek için kullanılır (örneğin, kullanıcı telefon araması yaparken veya gelen aramayı yanıtlarken). Ç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ğerlerini döndürür.

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

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

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" değerlerini temsil eden ikili değerler döndürür. Bu durumda sensör genellikle uzak durumdayken maksimum menzil değerini, yakın durumdayken ise daha düşük bir değeri bildirir. Genellikle uzak değeri 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,