Skip to main content

Using Accelerometer when Screen Off


Introduction

Android Phones have a lot of built-in sensor such as gyro, proximity and accelerometer.

Using Accelerometer in Android is a known thing. For listening sensors, class or service needs a SensorEventListener implementation. An Activity is only exists when you are seeing it. When phone enters standby mode, activity which was recently active frozen and restored whenever needed. While this frozen time, activity doesn’t run. Because of that it doesn’t need sensor updates. And Android stop to listen some sensors for power management.


Services have this condition like classes (activity). In contrast to class, a service run every time, even when phone is in standby mode. Therefore Services needs sensor updates for some situations. But android stop to listen some sensor(accelerometer) in some different phones.


There is a solution for that. This is not an exact solution but it work with a lot of phones.


With a BroadcastReceiver listen Intent.ACTION_SCREEN_OFF and register sensor listener again after screen goes off.



public class YonService extends Service implements SensorEventListener {
       private static SensorManager mySensorManager;
       BroadcastReceiver mReceiver;
       Context context;
       List mySensors;
     
       @Override
       public void onCreate() {
            
             mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
             mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);

             if(mySensors.size() > 0){
                    mySensorManager.registerListener(thismySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
             }
             context = YonService.this.getApplicationContext();

             IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
             filter.addAction(Intent.ACTION_SCREEN_OFF);
             mReceiver = new ScreenReceiver();
             registerReceiver(mReceiver, filter);
             super.onCreate();
       }    

       @Override
       public void onDestroy() {
// Unregisters sensorEventListenerImpl. This will stop notifications for all sensors
             mySensorManager.unregisterListener(this);
             unregisterReceiver(mReceiver);
             super.onDestroy();
       }

      public void onAccuracyChanged(Sensor arg0, int arg1) {
            // TODO Auto-generated method stub
      }

      public void onSensorChanged(SensorEvent event) {
            float azimuth = Math.round((float)event.values[0]);
            float pitch = Math.round((float)event.values[1]);
            float roll = Math.round((float)event.values[2]);
           
            Log.e("Values", azimuth +" "+pitch+" "+roll)
// Do anything you want with values     
      }

      @Override
      public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
      }

public class ScreenReceiver extends BroadcastReceiver {

             @Override
             public void onReceive(Context context, Intent intent) {
                    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// Unregister and register listener after screen goes off.
                          refreshListener ();
                      }             
             }
       }

       public void refreshListener(){
             mySensorManager.unregisterListener(this);
             mySensorManager.registerListener(thismySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
       }



Conclusion


I have test this workaround with my Samsung Galaxy S2 and a Galaxy mini. This code works on S2. But on Galaxy mini, listener register but after screen off phone give result for accelerometer but not real result; just it repeats last result when screen goes off. This code doesn't work on every phone.

Listening sensor in standby mode uses more battery. This is a problem for user, you should warn the user about battery usage.

If you find my blog or apps usefull, please consider donation.

Comments

  1. Hello. Please support my Note 2 samsung. It doesn't work when the screen is off. Please help. Thank you

    ReplyDelete
  2. @John I think the workaround is clear. It is just a method for using accelerometer when screen off. But it is not solution for all phone.

    ReplyDelete

Post a Comment

Popular posts from this blog

Android Telefonlarda Usb Problemi

Telefonum kendi kendine araba moduna girmeye ve şarj sırasında problem yaratmaya başladı. Genel olarak sorun usb portu ile alakalı olduğu kesindi. Telefonu bilgisayara taktığım zaman tanıyamıyor, bazen şarj oluyor bazen olmuyor, bazen takılı değilken bile şarj olduğunu zannediyordu. Sorunu yazılımsal olabilir diye her türlü şeyi denedim ama çözüm olmadı.

Sorunun çözümü olarak internette okuduğum ingilizce kaynaklarda USB portun 4 ve 5 inci pinlerinde gizli olduğunu öğrendim. Telefon 4 ve 5. pinler üzerinde direnç oluşunca (yağ, su, kir vb.) telefon araçta kullanıldığını zannediyor. Donanımsal bu uyarı yazılımsal desteklenmediği için telefon saçmalıyor.

Çözüm ise aslında çok basit ama uygularken dikkatli olmak lazım. Öncelikle kendiniz uğraşmanızı tavsiye etmiyorum. Bir profesyonele danışın yada teknik servise götürün.

CİHAZINIZDA OLUŞABİLECEK PROBLEMLERDE TÜM SORUMLULUK SİZE AİTTİR. BU YAZIDA ANLATTIKLARIM KENDİ TECRÜBELERİM VE YABANCI FORUMLARDAN OKUDUKLARIMDAN İBARETTİR.

1- Ama herşe…

Eclipse'te Android Sanal Makinesi oluşturma

Eclipse'te oluşturduğumuz projeleri denemek için Eclipse'te Android Sanal makinesı oluşturabiliriz. Bu yaptığımız programları önce bilgisayar üzerinde denememiz ve ilk izlenimlerimizi oluşturmamız için önemlidir. Her android sürümü için farklı sanal makine oluşturabileceğimiz için yazdığımız programın farklı sürümlerde nasıl çalıştığını görmemize yardımcı olur.

Bu sanal makineyi önceki yazılarda anlattığımız şekilde kurduğumuz Eclipse'te  bir kaç adımda oluşturabiliriz. Bunun içim aşağıdaki adımları izlememiz yeterli olucaktır.

Windows-> AVD Manager a tıklayalım. Açılan pencerede sağ üstten "New"e basarak yeni sanal makine oluşturacağımız ekrana gelelim.

Burda "Name" kısmına istediğimiz ismi yazabiliriz. Ama tavsiyem oluşturacağınız android sürümü ile alakalı isimler verin. örn: Android 2.1 sürümü için Andro_2.1 şeklinde isim verebilirsiniz.


"Target" kısmında oluşturacağınız sanal makinenin API sini seçmelisiniz.

SD kart kısmına sanal maki…