Android Servis ve Sensör Kullanımı

Ağustos 22, 2012

 

Merhaba arkadaşlar , tamamen tesadüf eseri aklıma gelen bir uygulama bayramda eclipse başında 1 saat geçirmemi sağladı daha önceleri samsung bir telefondan bildiğim özelliğin aynısını yapmak için bilgisayarımın başına geçtim bu sefer.Uygulama ise şu şekildeydi : Ana olarak başlatılıp durdurulabilen bir servis üzerinden telefonun ses moduna müdahele edebiliyordu.Örneğin bir toplantıya giriyorsunuz telefonunuzu masanın üzerine yüzü yatık kapatdığınız zaman bu telefonunuzun sessiz mod’da olması anlamına geliyordu, telefonun yüzü yukarı bakıyorsa buda telefonun sesli mod’da olduğu anlamına geliyordu.Azda olsa nasıl yapılabiliri düşündükten sonra bu tip bir uygulamanın servis ve sensör kullanılarak en uygun şekilde yapılabileceğine karar verdim ve kodlamaya başladım.Daha önce android sensör’ler ile ilgili yazıma buradan ulaşabilirsiniz.Android servis’leri siz bir kere başlattıktan sonra asıl uygulamanızı kapatsanız dahi arka planda çalışan bir yapıya sahiptirler özellikle siz durdurmadıkça çalışmaya devam ederler.Bu şekilde asıl uygulamanız dışındaki olaylardanda haberdar olarak reaksiyon gösterebilirsiniz.Örneğin çalar saat uygulamalarını düşünelim bir kere saat’i kurup uygulamayı kapatdığımızda istenilen saat’de uygulama aktif olarak tepki ile bizi uyarıyor.Uygulamamızı geliştirmek için eclipse’de bir tane proje oluşturalım

 

 

 

 

main.xml dosyamızda sadece bir tane ToggleButton ekleyelim ve id ‘sini btnToggle olarak ayarlayalım.Servisimizi kullanmak için bir tane Servis sınıfımızı ekleyelim daha sonra SesActivity.java dosyamızın içinde toggle buton’unun click event’ini yakalıyoruz ve servisimizin çalışıp durmasını atıyoruz kullanıcı seçimine göre

 

package com.Ses;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ToggleButton;
 
public class SesActivity extends Activity implements OnClickListener {
 
	ToggleButton btnToggle;
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
 
		btnToggle = (ToggleButton) findViewById(R.id.btnToggle);
		btnToggle.setOnClickListener(this);
	}
 
	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.btnToggle:
			if (btnToggle.isChecked()) {
				Intent intent = new Intent(SesActivity.this, Servis.class);
				startService(intent);
			} else {
				Intent intent = new Intent(SesActivity.this, Servis.class);
				stopService(intent);
			}
			break;
		}
	}
}

 
 

Servis.java sınıfımız ise şu şekilde

 

 

package com.Ses;
 
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.IBinder;
 
public class Servis extends Service implements SensorEventListener {
 
	SensorManager sManager;
	Sensor sensor;
 
	private BroadcastReceiver broadcastReceiver= new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
				sManager.unregisterListener(Servis.this);
				sManager.registerListener(Servis.this, sensor,
						SensorManager.SENSOR_DELAY_NORMAL);
			}
		}
	};
 
	@Override
	public void onCreate() {
		sManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		sensor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		sManager.registerListener(this, sensor,
				SensorManager.SENSOR_DELAY_NORMAL);
 
		IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
		registerReceiver(broadcastReceiver, filter);
	}
 
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
 
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return Service.START_NOT_STICKY;
	}
 
	@Override
	public void onDestroy() {
		super.onDestroy();
	}
 
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
	}
 
	@Override
	public void onSensorChanged(SensorEvent event) {
		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
 
			float z = event.values[2];
 
			AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
 
			if (z > -8.5) {
				audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
			} else {
				audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
			}
		}
	}
 
}

 

Servis sınıfımızı SensorEventListener’dan implemente ediyoruz ve gerekli method’ları eziyoruz.İşlemlerimizi onSensorChanged() method’unda gerçekleştireceğiz. BroadcastReceiver ise android sistemi tarafından fırlatılan mesajları yönetim kısmıdır.Burada bizde kod ile müdahele ediyoruz.BroadcastReceiver ile ilgili daha açıklayıcı bir yazıya buradan ulaşabilirsiniz. onCreate() method’u için bir önceki sensör’ler ile ilgili yazımı inceleyebilirsiniz. onSensorChanged() method’unda ise sensör’ün Z ekseni değerini yakalıyoruz event.values[2]; bize bu değeri veriyor.Köşeli parantezler [] içerisindeki değer 0 olursa X , 1 olursa Y değerine ulaşabiliriz.Bu Z değeri telefon’un yüzü yukarı bakıyorsa pozitif (+), telefonun yüzü yere bakıyorsa negatif (-) değer alıcaktır bu yüzden elde ettiğimiz z değerimiz -8.5 ‘dan büyükse telefonu sesli mod’a eğer değil ise sessiz mod’a alıyoruz.Ses mod’unu AudioManager yardımı ile değiştiriyoruz. setRingerMode() RINGER_MODE_NORMAL olarak atanırsa telefon sesli mod’da , RINGER_MODE_SILENT olarak atanırsa sessiz mod’da olarak ayarlamış oluyoruz.

 

Son olarak AndroidManifest.xml dosyamıza iznimizi eklemeyi unutmuyoruz
 

 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

 
 

Kaynak Kodları Buradan İndirebilirsiniz

 
 
 
 
 
 

posted in Android by gokhan

Follow comments via the RSS Feed | Yorum yapın | Trackback URL

2 Comments to "Android Servis ve Sensör Kullanımı"

  1. ando wrote:

    x y z değerlerini ne gireceğiz?

  2. gokhan wrote:

    Merhaba,

    X, Y, Z değerlerini sen girmiyorsun uygulamayı çalıştırınca o buluyor ve ekrana textbox lara yazıyor.

Leave Your Comment

*

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org