Mobil Programlama

Android

Android'de Sensör Kullanımı

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

 

Günümüzde pek çok cihaz üzerinde hareket sensörleri eklenmiş halde satılmaktadır. Bu sensörler cihazın çeşitli eksenlerde yaptığı hareketleri takip ederek uygulamaya bildirir ve kullanıcının hareketine göre bir eylem gerçekleştirilmesini sağlar. Özellikle son dönemde yarış ve FPS (First-person shooter) türündeki oyunlarda cihaz hareketiyle oyun karakterlerinin kontrol edilmesi bu sensörler sayesinde gerçekleşir. Biz de bu bölümde sizlere bu sensörlerin kullanımına dair basit bir örnek sunacağız.

Sol yanda örnek proje kodlarını indirebileceğiniz uygulamada amacımız, öncelikle sensörden gelen veriyi takip etmek olacak. Bunun için sensör verisine ihtiyaç duyduğumuz sınıfta SensorEventListener sınıfını gerçeklememiz gerekiyor. Bu şekilde sensörden gelen verileri izleme şansı elde ediyoruz.
 

 

public class MainActivity extends Activity implements SensorEventListener {

 

 

SensorEventListener sınıfı bizden aşağıdaki metotların kodlanmasını talep ediyor. Bu metotlar sensörden gelen bilgileri anlık olarak dinlememizi sağlıyor.

 

@Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
   }
 
   @Override
   public void onSensorChanged(SensorEvent event) {
      
   }

 

 

Sensör hareketlerini dinlemeye başlamadan önce sistem servislerinden sensör servisi çağırarak SensorEventListener sınıfını dinleyici olarak atamamız gerekir. Activity içerisindeki onCreate metodu içerisinde bu kayıt işlemini gerçekleştiriyoruz.

 

private SensorManager sensorManager;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);                               
}

 

 

Burada yapılan işlem sonrasında Accelerometer adlı sensörden gelen hareketler onSensorChanged metodu içerisinde dinlenmeye başlanacaktır. registerListener metodu içerisinde tanımlanan SENSOR_DELAY değişkeni sensörün duyarlılığını belirler. Burada kullanabileceğimiz değerler aşağıdaki gibidir:
 

SENSOR_DELAY_NORMAL - Kullanıcının basit hareketlerini düşük duyarlılıkla takip eder. (215 - 230 ms)

SENSOR_DELAY_FASTEST Sensörden gelen hareketlerin mümkün olduğu kadar fazla kısmının değerlendirilmesini sağlar. (15-20 ms)

SENSOR_DELAY_GAME Oyun uygulamaları için yüksek duyarlılıkla dinleme gerçekleştirir. (35-40 ms)

SENSOR_DELAY_UI Normal kullanım için idealdir. (85-90 ms)

 

Burada dikkat etmemiz gereken; veri artışıyla beraber işlemcinin de daha fazla çalışacağı gerçeğidir. Bu yüzden duyarlılığı arttırmamız düşük performanslı cihazlarda sorun yaratabilir.

Sensörü kaydettikten sonra Activity’yi onDestroy metodu içerisinde yok etmeyi unutmamalıyız.

 

@Override
   protected void onDestroy() {
      super.onDestroy();
      sensorManager.unregisterListener(this);
   }

 

 

Sensörden gelen veri onSensorChanged metodu içerisinde event değişkeni üzerinden gönderilir. Accelerometer adlı sensör bize telefonun x, y ve z ekseni üzerinde yaptığı hareketleri aşağıdaki şekilde verir:

 

@Override
public void onSensorChanged(SensorEvent event) {
  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    float[] values = event.values;
    float x = values[0];
    float y = values[1];
    float z = values[2];
 
    Log.d("MainActivity", String.format("x : %f y : %f z : %f", x, y, z));
  }
}

 

 

Sensörden gelen değerler values dizisi içinde gönderilir. Biz burada her eksende yapılan hareketi LogCat içerisinde ekrana yazdırıyoruz.

Şimdi telefonu ters çevirdiğimizde (180 derece döndürdüğümüzde) titreşim yaratacak bir uygulama hazırlayacağız. 180 derece döndürme hareketi için z ekseninden gelen değerleri takip ederek değerin pozitiften negatife (ya da negatiften pozitife) değişiminde istenilen eylemi gerçekleştireceğiz. Öncelikle titreşim için AndroidManifest dosyasında gerekli izinleri alalım.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.turkcell.sensorexample"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.turkcell.sensorexample.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
    <uses-permission android:name="android.permission.VIBRATE" />
 
</manifest>

 

 

android.permission.VIBRATE ile uygulamaya titreşim izni verdikten sonra MainActivity altında titreşim servisine erişiyoruz ve vibrator değişkenine bu servisi tanımlıyoruz. Bununla beraber last_z değeri sensörden gelen önceki değeri saklamamızı sağlayacak.

 

 

private SensorManager sensorManager;
private Vibrator vibrator;
private float last_x, last_y, last_z = 0;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
 
  vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}

 

 

Bu aşamadan sonra yapmamız gereken onSensorChanged metodunda yukarıda anlatılan işlemi gerçekleştirmek olacaktır. z * last_z çarpımı negatif olduğunda cihazın 180 derece döndürüldüğünü anlayabiliriz. Bu gerçekleştiğinde de vibrate metoduyla 500 ms süre boyunca cihazı titreterek kullanıcıya bir uyarı veriyoruz.

 

@Override
public void onSensorChanged(SensorEvent event) {
  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    float[] values = event.values;
    float x = values[0];
    float y = values[1];
    float z = values[2];
 
    if (z*last_z < 0) {
      vibrator.vibrate(500);
    }
 
    Log.d("MainActivity", String.format("x : %f y : %f z : %f", x, y, z));
    last_x = x;
    last_y = y;
    last_z = z;
  }
}