Konum sensörleri

Android platformu konumu belirlemenizi sağlayan iki sensör sağlar : jeomanyetik alan sensörü ve ivme ölçer. Android platform aynı zamanda bir evin yüzeyine ne kadar yakın (yakınlık sensörü olarak bilinir) bir cihazdır. İlgili içeriği oluşturmak için kullanılan jeomanyetik alan sensörü ve yakınlık sensörü donanım tabanlıdır. En sık Cihaz ve tablet üreticileri jeomanyetik alan sensörü sağlamaktadır. Aynı şekilde, mobil telefon üreticileri, 2D modelin ne zaman kapanacağını belirlemek için genellikle mobil cihazın kullanıcının yüzüne yakın tutulması (örneğin, çağrısı) gerekir. Cihazın yönünü belirlemek için Google Haritalar'daki cihazın ivme ölçeri ve jeomanyetik alan sensörü.

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

Konum sensörleri, cihazın fiziksel konumunu belirlemek için düşünülebilir. Örneğin, jeomanyetik alanı kullanabilirsiniz bir cihazın konumunu belirlemek için ivme ölçerle birlikte sensör manyetik kuzey kutbuna göre değişir. Bu sensörleri ayrıca, uygulamanızın referans çerçevesindeki cihazın yönünü belirler. Konum sensörleri genelde cihazın hareketini veya hareketini izlemek için kullanılmaz. (daha fazla bilgi için bkz. Hareket sensörleri'ne bakın).

Jeomanyetik alan sensörü ve ivme ölçer çok boyutlu diziler döndürür her SensorEvent için sensör değerlerinin toplamıdır. Örneğin, jeomanyetik alan sensörü, jeomanyetik alan gücü üç koordinat ekseninin her biri için ayrı bir zaman çizelgesi oluşturmak üzere kullanılır. Benzer şekilde ivme ölçer sensörü, 20 dakikada cihaza uygulanan ivmeyi ölçer sensör olayına bakalım. Kullanılan koordinat sistemleri hakkında daha fazla bilgi için için bkz. Sensör koordinat sistemleri. Yakınlık sensörü tek bir değer sağlar tıklayın. Tablo 1'de, en düşük konum sağlayan konum sensörleri Android platformunda destekleniyor.

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(∧/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(∧/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) sürümünde kullanımdan kaldırılmıştır seviye 8) 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 alımı için alternatif yöntemler sunar Bu, Compute Engine'de açıklandığı şekilde cihazın yönünü kontrol edin.

2 Bazı yakınlık sensörleri yalnızca ikili değerler sağlar temsil eder.

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

Oyun dönüş vektörü sensörü, Rotasyon vektör sensörü (jeomanyetik alanı kullanmaz). Dolayısıyla Y ekseni başka bir referans noktası görevi görebilir. Bu referansın jiroskopun Z ekseni etrafında kaymasıyla aynı büyüklük sıralamasına sahiptir.

Oyun dönüş vektörü sensörü manyetik alanı kullanmadığı için, göreceli dönüşler ve manyetik alan değişikliklerinden etkilenmez. Aşağıdaki durumlarda oyunda bu sensörü kullanın: kuzeyin nerede olduğunu umursamıyorsunuz ve normal dönüş vektörü ihtiyaçlarınızı karşılamıyor. çünkü manyetik alana bağımlıdır.

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

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önüş vektörü sensörü dönme vektör sensörü ile başlar, ancak jiroskopu kullanmıyor. Bu sensörün doğruluğu normal dönüş vektöründen düşüktür ancak güç tüketimi azalır. Bu sensörü yalnızca dönüş verilerini toplamak istiyorsanız kullanın arka planda çok fazla pil kullanmadan bilgi kullanımını sağlar. Bu sensör en çok kullanıldığında faydalıdır birlikte kullanılmasını sağlar.

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

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

Cihazın yönünü hesaplayarak, her bir öğenin konumunu izleyebilirsiniz. cihazın referans çerçevesine bağlı olarak (özellikle, manyetik kuzey kutbu). Aşağıdaki kodda, bir cihazın her bir özelliğinin değerini yön:

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ı hesaplarken cihazın jeomanyetik cihaz ivme ölçeriyle birlikte alan sensörü. Bu ikisini kullanmak sistem aşağıdaki üç cihaz için veri sağlar: yön açıları:

  • Azimut (-z ekseni etrafındaki dönme dereceleri). Bu cihazın geçerli pusula yönü ile manyetik kuzey arasındaki açı. Cihazın üst kenarı manyetik kuzey yönüne bakıyorsa azimut 0 olur derece; üst kenar güneye bakıyorsa azimut 180 derecedir. Aynı şekilde, üst kenar doğuya bakıyorsa azimut 90 derecedir ve üst kenarın üst kenarı 90 derecedir batıya bakarken azimut 270 derecedir.
  • Eğim (x ekseni etrafındaki dönüş dereceleri). Bu, cihazın ekranına paralel bir düzlem ile paralel düzlem arasındaki açı zemine koydu. Cihazı zemini tabanına paralel tutarsanız kendinize en yakın kenarını çekin ve cihazın üst kenarını zemine doğru eğin, eğim açısı pozitif hale gelir. Ters yönde yatırma— cihazın üst kenarını yerden uzaklaştırarak açısını negatife çevirir. Değer aralığı -90 derece ile - 90 derece.
  • Yuvarla döndürme (y ekseni etrafındaki dönüş dereceleri). Bu, cihazın ekranına dik bir düzlem ile düzlem arasındaki açı hizalanır. Cihazı zemine paralel tutarsanız alt kenarı size en yakın olacak şekilde yerleştirin ve cihazın sol kenarını eğin doğru yuvarlanma açısı pozitif hale gelir. Aksi yönde yatırma yönde (cihazın sağ kenarını zemine doğru hareket ettirerek) yuvarlanma açısının negatif olmasına neden olur. Değer aralığı -180 derecedir 180 dereceye kadar.

Not: Sensörün yuvarlanma tanımı jeosensör ekosistemindeki uygulamaların büyük bir çoğunluğu.

Bu açıların, koordinat sisteminden farklı bir koordinat sisteminde havacılıkta kullanılan (sapma, dönüş ve yuvarlanma için) Havacılık sisteminde, x ekseni, uçağın uzun kenarı boyunca (kuyruktan buruna) kadardır.

Yön sensörü, ham sensör verilerini işleyerek verilerini türetir ivme ölçer ve jeomanyetik alan sensöründen alınır. Yoğun kondisyon yönlendirmenin doğruluğu ve kesinliği de dahil, sensör azaldı. Daha net bir ifadeyle, bu sensör yalnızca yuvarlama yaptığınızda güvenilirdir. açı 0'dır. Bunun sonucunda, yön sensörü Android'de kullanımdan kaldırıldı. 2.2 (API düzeyi 8) ve yön sensörü türü Android'de kullanımdan kaldırıldı 4,4W (API düzeyi 20). Yön sensöründen alınan ham verileri kullanmak yerine getRotationMatrix() bağlantısını kullanın yöntemi ile birlikte getOrientation() yöntem Yön değerlerini hesaplamak için aşağıdaki kod örneğinde gösterildiği gibi. Parçası bu sürecin devamında remapCoordinateSystem(). yön değerlerini uygulamanızın çerçeve bir referans noktası olarak kabul edilir.

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

Genelde veriler için veri işleme veya filtreleme sensörün çevirmeden başka ham yön açılarını da koordinasyon sistemini uygulamanızın referans çerçevesine göre düzenler.

Jeomanyetik alan sensörünü kullanma

Jeomanyetik alan sensörü dünyanın manyetik alanındaki değişiklikleri izlemenize olanak tanır. İlgili içeriği oluşturmak için kullanılan aşağıdaki kod, varsayılan jeomanyetik alan 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_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 bu sensör daha yüksek sıralı olarak sınırlandırılmıştı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, döndürme vektörünü Sensör kullanarak ham dönme hareketini belirleyebilir veya ivme ölçer ve jeomanyetik alan yöntemini getRotationMatrix() yöntemi ile birlikte kullanarak döndürme matrisini ve eğim matrisini elde edebilirsiniz. Ardından bu matrisleri getOrientation() ile kullanın ve azimut elde etmek için getInclination() yöntemleri jeomanyetik eğim verileri.

Not: Uygulamanızı test ederken, sensörün doğruluğunu kontrol etmek için cihazı 8-8 deseni ile sallayın.

Kalibre edilmemiş manyetometreyi kullanma

Kalibre edilmemiş manyetometre, jeomanyetik alana benzer sensörü ile çalışması gerekir. Tek fark, manyetik alana sert demir kalibrasyonu uygulanmamasıdır. Fabrika kalibrasyonu ve sıcaklık dengelemesi manyetik alana uygulanmaya devam ediyor. Kalibre edilmemiş manyetometre kötü sert demir tahminlerinin ele alınmasında yararlıdır. Genel olarak, geomagneticsensor_event.values[0] uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3] civarında olacaktır. Yani,

calibrated_x ~= uncalibrated_x - bias_estimate_x

Not: Kalibre edilmemiş sensörler daha fazla ham sonuç sağlar ve bazı sapmaları da içerir, ancak ölçümlerine kalibrasyondur. Bazı uygulamalar, kalibre edilmemiş bu sonuçları daha akıcı ve etkili olduğu için tercih edebilir. yardımcı olur. Örneğin, bir uygulama kendi sensör füzyonunu yapmaya çalışıyorsa Hatta kalibrasyon uygulamak sonuçları bozabilir.

Kalibre edilmemiş manyetometre, manyetik alana ek olarak tahmini sert demir sapması. Aşağıdaki kodda varsayılan kalibre edilmemiş manyetometre:

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ğıdakiler kodu, 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 yüzünün ne kadar uzakta olduğunu belirlemek için kullanılır (örneğin, kullanıcı bir telefon görüşmesi yaparken veya alırken). En sık yakınlık sensörleri mutlak mesafeyi cm cinsinden döndürür, ancak bazıları yalnızca yakın ve fark eder.

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

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". Bu durumda, sensör genellikle uzak durumdaki maksimum aralık değerini bildirir yakın durumda daha küçük bir değere sahip olur. Genellikle, uzak değer bir değerdir > 5 cm'dir, ancak bu süre değişiklik gösterebilir yardımcı olabilir. getMaximumRange() yöntemini kullanarak bir sensörün maksimum menzilini belirleyebilirsiniz.

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