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 sağlar (yakınlık sensörü olarak bilinir). Jeomanyetik alan sensörü ve yakınlık sensörü donanıma dayalıdır. Çoğu cep telefonu ve tablet üreticisi, jeomanyetik alan sensörü içerir. Benzer şekilde, telefon üreticileri genellikle bir telefonun kullanıcının yüzüne yakın tutulduğu zamanı (örneğin, telefon görüşmesi sırasında) belirlemek için yakınlık sensörü ekler. Bir cihazın yönünü belirlemek için cihazın ivme ölçerinden ve jeomanyetik alan sensöründen alınan 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ünyanın 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 hareketini veya sarsma, eğme ya da itme gibi hareketleri izlemek için kullanılmaz (daha fazla bilgi için Hareket sensörleri başlıklı makaleyi inceleyin).

Jeomanyetik alan sensörü ve ivmeölçer, her SensorEvent için çok boyutlu sensör değerleri dizileri 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ü de 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] Dönüş vektörünün x ekseni üzerindeki bileşeni (x * sin(θ/2)). Birim yok
SensorEvent.values[1] Dönüş vektörünün y ekseni üzerindeki bileşeni (y * sin(θ/2)).
SensorEvent.values[2] Dönüş vektörünün z ekseni üzerindeki bileşeni (z * sin(θ/2)).
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] Dönüş vektörünün x ekseni üzerindeki bileşeni (x * sin(θ/2)). Birim yok
SensorEvent.values[1] Dönüş vektörünün y ekseni üzerindeki bileşeni (y * sin(θ/2)).
SensorEvent.values[2] Dönüş vektörünün z ekseni üzerindeki 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 önyargısı tahmini.
SensorEvent.values[4] Y ekseni boyunca demir önyargısı tahmini.
SensorEvent.values[5] Z ekseni boyunca demir önyargısı tahmini.
TYPE_ORIENTATION1 SensorEvent.values[0] Azimut (z ekseni etrafındaki açı). Derece
SensorEvent.values[1] Eğme (x ekseni etrafındaki açı).
SensorEvent.values[2] Yuvarlanma (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) kullanımdan kaldırılmış ve bu sensör türü Android 4.4W'de (API düzeyi 20) kullanımdan kaldırılmıştır. Sensör çerçevesi, cihaz yönünü elde etmek için alternatif yöntemler sunar. Bu yöntemler Cihazın yönünü hesaplama bölümünde açıklanmış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 rotasyon vektörü sensörünü kullanma

Oyun döndürme vektörü sensörü, jeomanyetik alanı kullanmaması dışında Döndürme 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ındaki kaymasıyla aynı büyüklük sırasına göre kaymasına izin verilir.

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

Aşağıdaki kodda, varsayılan oyun döndürme vektörü sensörünün 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_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önme vektörü sensörünü kullanma

Jeomanyetik döndürme vektörü sensörü, döndürme vektörü sensörüne benzer ancak jiroskop kullanmaz. Bu sensörün doğruluğu normal dönme vektörü sensöründen daha düşüktür ancak güç tüketimi azalır. Bu sensörü yalnızca arka planda çok fazla pil kullanmadan dönme bilgisi toplamak istiyorsanız kullanın. Bu sensör, toplu işleme ile birlikte kullanıldığında en iyi sonucu verir.

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ünyanın referans çerçevesine (özellikle manyetik kuzey kutbu) göre konumunu izleyebilirsiniz. Aşağıdaki kodda, bir 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, yönlendirme açılarını hesaplamak için cihazın ivmeölçeriyle birlikte cihazın jeomanyetik alan sensörünü kullanır. Bu iki donanım sensörünü kullanan sistem, aşağıdaki üç yönlendirme açısı için veri sağlar:

  • Azimut (-z ekseni etrafında dönme dereceleri). 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, güneye bakıyorsa 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önme derecesi). Bu, cihazın ekranına paralel bir düzlem ile yere paralel bir düzlem arasındaki açıdır. Cihazı yere paralel şekilde tutarken alt kenarı size en yakın olacak ve cihazın üst kenarı yere doğru eğilecek şekilde tutarsanız eğim açısı pozitif olur. Cihazın üst kenarını yerden uzaklaştırarak ters yönde eğmek, eğim açısının negatif olmasına neden olur. Değer aralığı -90 derece ile 90 derece arasındadır.
  • Yuvarlanma (Y ekseni etrafında dönme derecesi). Bu, cihazın ekranına dik bir düzlem ile yere dik bir düzlem arasındaki açıdır. Cihazı yere paralel tutarken alt kenarı size en yakın olacak şekilde konumlandırıp cihazın sol kenarını yere doğru eğerseniz yuvarlanma açısı pozitif olur. Cihazın sağ kenarını yere doğru hareket ettirerek ters yönde eğmek, yuvarlanma 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ı, 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 (sapma, eğim ve yuvarlanma için) koordinat sisteminden farklı bir koordinat sistemiyle ç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. İşlem yoğunluğu nedeniyle yön sensörünün doğruluğu ve hassasiyeti azalır. Bu sensör özellikle yalnızca yuvarlanma açısı 0 olduğunda güvenilirdir. Sonuç olarak, 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önlendirme sensöründen gelen ham verileri kullanmak yerine, yönlendirme değerlerini hesaplamak için aşağıdaki kod örneğinde gösterildiği gibi getRotationMatrix() yöntemini getOrientation() yöntemiyle birlikte kullanmanızı öneririz. Bu sürecin 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önlendirme açılarıyla ilgili 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 kodda, varsayılan jeomanyetik alan sensörünün ö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)

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'yi (API düzeyi 31) veya daha yeni bir sürümü hedefliyorsa bu sensörün kullanım sıklığı 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önme vektörü sensörünü kullanabilir veya dönme matrisini ve eğim matrisini elde etmek için ivme ölçer ve jeomanyetik alan sensörünü getRotationMatrix() yöntemiyle birlikte kullanabilirsiniz. Daha sonra, azimut ve jeomanyetik eğim verilerini elde etmek için bu matrisleri getOrientation() ve getInclination() yöntemleriyle birlikte kullanabilirsiniz.

Not: Uygulamanızı test ederken cihazı 8 rakamı ş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 dengelemesi, manyetik alana uygulanmaya devam eder. Kalibre edilmemiş manyetometre, kötü sabit 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 olur. Yani,

calibrated_x ~= uncalibrated_x - bias_estimate_x

Not: Kalibre edilmemiş sensörler daha fazla ham sonuç sağlar ve bazı sapmalar içerebilir ancak ölçümleri, kalibrasyon yoluyla uygulanan düzeltmelerden daha az atlama içerir. Bazı uygulamalar, bu kalibre edilmemiş sonuçları daha sorunsuz ve güvenilir bulabilir. Ö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 sabit demir sapmasını da sağlar. Aşağıdaki kodda, varsayılan kalibre edilmemiş manyetometrenin 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_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 cihazdan ne kadar uzakta 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, bir cep telefonu cihazının yüzünden ne kadar uzakta olduğunu belirlemek için kullanılır (örneğin, kullanıcı telefon görüşmesi yaparken veya alırken). Ç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 nedenle, ekran açıkken etkinleştirilirse ekranda yanıp sönen bir nokta görünebilir.

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 aralık değerini, yakın durumdayken ise daha düşük bir değeri bildirir. Genellikle uzak değer 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 aralığını belirleyebilirsiniz.

Ayrıca