Konum sensörleri

Android platformu, cihazların konumunu belirlemenizi sağlayan iki sensör sunar: jeomanyetik alan sensörü ve ivme ölçer. Android platformu da bir cihazın yüzünün bir nesneye ne kadar yakın olduğunu belirleyebilmenizi sağlayan bir sensör (yakınlık sensörü olarak bilinir) de sağlar. Jeomanyetik alan sensörü ve yakınlık sensörü donanım tabanlıdır. Çoğu mobil cihaz ve tablet üreticisi jeomanyetik alan sensörü içerir. Benzer şekilde, telefon üreticileri de telefonun kullanıcının yüzüne yakın tutulduğunu (örneğin, telefon görüşmesi sırasında) belirlemek için genellikle bir yakınlık sensörü kullanır. 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 (API düzeyi 8) sürümünde, yön sensörü türü ise Android 4.4W (API düzeyi 20) sürümünde kullanımdan kaldırılmıştır.

Konum sensörleri, bir cihazın dünyanın referans çerçevesindeki fiziksel konumunu belirlemek için yararlı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çevesindeki cihazın yönünü belirlemek için de kullanabilirsiniz. Konum sensörleri genelde titreme, yatırma veya itme gibi cihaz hareketlerini ya da 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 çok boyutlu sensör değeri dizilerini 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ü 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 olayı için tek bir değer sağlar. Tablo 1'de Android platformunda desteklenen konum sensörleri özetlenmektedir.

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 (x * sin(∧/2)) boyunca döndürme vektör bileşeni). Birimsiz
SensorEvent.values[1] Y eksenindeki döndürme vektör bileşeni (y * sin(∧/2)).
SensorEvent.values[2] Z ekseni boyunca döndürme vektör bileşeni (z * sin(rel/2)).
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] x ekseni (x * sin(∧/2)) boyunca döndürme vektör bileşeni). Birimsiz
SensorEvent.values[1] Y eksenindeki döndürme vektör bileşeni (y * sin(∧/2)).
SensorEvent.values[2] Z ekseni boyunca döndürme vektör bileşeni (z * sin(rel/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 eksenindeki 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 yangı tahmini.
SensorEvent.values[4] Y ekseni boyunca demir yanlılığı tahmini.
SensorEvent.values[5] Z ekseni boyunca demir yangı tahmini.
TYPE_ORIENTATION1 SensorEvent.values[0] Azimut (z ekseni etrafındaki açı). Derece
SensorEvent.values[1] Eğim (x ekseninin etrafındaki açı).
SensorEvent.values[2] Yuvarla (y ekseninin etrafındaki açı).
TYPE_PROXIMITY SensorEvent.values[0] Nesneden uzaklık.2 cm

1Bu sensör, Android 2.2 (API düzeyi 8) sürümünde ve 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ü öğrenmek için alternatif yöntemler sağlar. Bu yöntemler, Cihazın yönünü hesaplama bölümünde açıklanmaktadı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 Döndürme vektör sensörüyle aynıdır. Dolayısıyla, Y ekseni kuzeyi değil, başka bir referansı işaret eder. Bu referansın, jiroskopun Z ekseni etrafında kaymasıyla aynı büyüklük sırasında kaymasına izin verilir.

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

Aşağıdaki kod, varsayılan oyun döndürme vektör 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_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önme 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üşüktür, ancak güç tüketimi azalır. Bu sensörü yalnızca çok fazla pil kullanmadan dönme bilgilerini arka planda toplamak istiyorsanız kullanın. Bu sensör en çok toplu işlem ile birlikte kullanıldığında yararlıdır.

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 konumunu dünyanın referans çerçevesine (özellikle de manyetik kuzey kutbuna) göre izleyebilirsiniz. Aşağıdaki kodda cihazın yönünü nasıl hesaplayacağınız 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 ivme ölçeriyle birlikte cihazın jeomanyetik alan sensörünü kullanarak yön açılarını 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ındaki dönme dereceleri). Bu, cihazın mevcut pusula yönü ile manyetik kuzey arasındaki açıdır. Cihazın üst kenarı manyetik kuzey yönüne bakıyorsa azimut 0 derece; üst kenar güneye bakıyorsa azimut 180 derecedir. Benzer şekilde, üst kenar doğuya bakıyorsa azimut 90 derece, üst kenar batıya bakıyorsa azimut 270 derece olur.
  • Eğim (x ekseni etrafındaki dönüş 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 zemine paralel tutar ve cihazın üst kenarını zemine doğru eğerseniz, dönüş açısı pozitif olur. Cihazın zıt yönde yatırılması (cihazın üst kenarının yerden uzaklaştırılması) perde açısının negatif olmasına neden olur. Değer aralığı -90 derece ile 90 derece arasındadır.
  • Yuvarla döndürme (y ekseni etrafındaki dönüş dereceleri). Bu, cihazın ekranına dik bir düzlem ile zemine dik bir düzlem arasındaki açıdır. Cihazı, alt kenarı size en yakın olacak şekilde zemine paralel tutar ve cihazın sol kenarını zemine doğru eğerseniz yuvarlanma açısı pozitif olur. Cihazın zıt yönde yatırılması (cihazın sağ kenarının yere doğru taşınması) 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ştirilmiştir.

Bu açıların havacılıkta kullanılandan farklı bir koordinat sisteminde (sapma, dönüş ve yuvarlanma için) kullanıldığına dikkat edin. Havacılık sisteminde x ekseni, kuyruktan buruna kadar uçağın uzun kenarındadır.

Yön sensörü, verilerini ivme ölçer ve jeomanyetik alan sensöründen alınan ham sensör verilerini işleyerek türetir. Karmaşık bir işlem işlemi nedeniyle yön sensörünün doğruluğu ve hassasiyeti azalır. Daha açık belirtmek gerekirse bu sensör yalnızca yuvarlanma açısı 0 olduğunda güvenilirdir. Bunun sonucunda, Android 2.2'de (API düzeyi 8) yön sensörü, Android 4.4W (API düzeyi 20) sürümünde ise yön sensörü türü kullanımdan kaldırılmıştır. Yön değerlerini hesaplamak için yön sensöründen alınan ham verileri kullanmak yerine, aşağıdaki kod örneğinde gösterildiği gibi getRotationMatrix() yöntemini getOrientation() yöntemiyle birlikte kullanmanızı öneririz. Bu işlem 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 ya da filtreleme işlemi gerçekleştirmeniz 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 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 sonraki sürümleri hedefliyorsa bu sensör hızla sınırlıdı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ü veya dönme matrisini ve eğim matrisini elde etmek için getRotationMatrix() yöntemiyle birlikte ivme ölçer ve jeomanyetik alan sensörünü kullanabilirsiniz. Daha sonra bu matrisleri getOrientation() ve getInclination() yöntemleriyle birlikte kullanarak azimut ve jeomanyetik eğim verilerini elde edebilirsiniz.

Not: Uygulamanızı test ederken cihazı şekil-8 deseninde sallayarak sensörün doğruluğunu iyileştirebilirsiniz.

Kalibre edilmemiş manyetometreyi kullanma

Kalibre edilmemiş manyetometre, jeomanyetik alan sensörüne benzer. Tek fark, manyetik alana sert demir kalibrasyonu uygulanmaz. Manyetik alana hâlâ fabrika kalibrasyonu ve sıcaklık dengeleme uygulanmıştır. Kalibre edilmemiş manyetometre, kötü sert demir tahminlerini değerlendirmek için kullanışlıdır. Genel olarak, geomagneticsensor_event.values[0] uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3] yakınında olur. Yani,

calibrated_x ~= uncalibrated_x - bias_estimate_x

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

Manyetik alana ek olarak, kalibre edilmemiş manyetometre de her bir eksen için tahmini sert demir sapmasını verir. Aşağıdaki kod, varsayılan kalibre edilmemiş manyetometrenin 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_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ü kullan

Yakınlık sensörü, bir nesnenin cihazdan ne kadar uzakta olduğunu belirlemenizi sağlar. 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 telefon 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ü cm cinsinden mutlak mesafeyi döndürse de 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 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ğerini 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ğeri bildirir. Uzak değer genelde 5 cm'nin üzerindedir ancak bu değer sensörden sensöre farklılık gösterebilir. getMaximumRange() yöntemini kullanarak bir sensörün maksimum menzilini belirleyebilirsiniz.

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