Akcelerometr zastaví dodávání vzorků, když je vypnutá obrazovka, na Droid / Nexus One is zámek probuzení

hlasů
23

Mám nějaký kód, který rozšiřuje službu a záznamy onSensorChanged (SensorEvent událost) Akcelerometr čidlo údaje na Android. Chtěl bych, aby bylo možné zaznamenat tyto údaje ze senzorů, i když je přístroj vypnutý (Jsem opatrný s životností baterie a je také zřejmé, když je to běh). I když je obrazovka na logování funguje na 2.0.1 Motorola Droid a 2,1 Nexus One.

Nicméně, když je telefon přejde do režimu spánku (stisknutím tlačítka napájení) se obrazovka vypne a onSensorChangedudálosti zastavit doručována (ověřit pomocí zprávy Log.e každých krát N onSensorChangedvolána).

Tato služba získává zámek probuzení, abyste zjistili, že stále běží na pozadí; ale to nevypadá, že nemá žádný vliv. Snažil jsem se všemi různými PowerManager. probudit zámky, ale žádný z nich se zdají důležité.

_WakeLock = _PowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, My Tag);
_WakeLock.acquire();

Tam byly konfliktní zprávy o tom, zda nebo ne, můžete skutečně získat data ze senzorů, když je vypnutá obrazovka, ... někdo nějaké zkušenosti s tímto na modernější verzi systému Android (Eclair) a hardware?

To nasvědčuje tomu, že to bylo pracoval v Košíčky: http://groups.google.com/group/android-developers/msg/a616773b12c2d9e5

PS: Přesně stejný kód funguje, jak bylo zamýšleno v bodě 1.5 na G1. Protokolování pokračuje, když je obrazovka vypnutá, když je aplikace na pozadí, atd.

Položena 26/01/2010 v 23:19
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
8

Máme odvodit to začalo od roku 2.0.1. Zdá se to být úmyslné, možná část životnosti baterie boost, který byl nabízený jako rys. Měli jsme pracovní chvění vzbudit nebo odemčení na 2,0, pak se zlomil na aktualizaci a my jsme nebyli schopni se dostat jakýkoliv druh řešení. ; "(Nezáleží na tom, jestli CPU částečný zámek se koná který by měl vždy předcházet CPU do režimu spánku Z toho, co jsem viděl, logování přes USB se zdá být někdy zmínka o změnách senzor posluchače jako spánek stane..

Uživatel zveřejnil řešení, které on prohlásil prací na zařízení Motorola - https://sites.google.com/a/bug-br.org.br/android/technical-documents

Zkoušel jsem řešení, přijít s následujícím kódem z tutoriálu a některé manuální revizi (existuje několik „chyb“ ve svém výukovém prezentovány kódu):

public class ShakeWakeupService extends Service implements SensorEventListener{
     private Context mContext;
     SensorManager mSensorEventManager;
     Sensor mSensor;

     // BroadcastReceiver for handling ACTION_SCREEN_OFF.
     public BroadcastReceiver mReceiver = new BroadcastReceiver() {

         @Override
         public void onReceive(Context context, Intent intent) {
             // Check action just to be on the safe side.
             if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                 Log.v("shake mediator screen off","trying re-registration");
                 // Unregisters the listener and registers it again.
                 mSensorEventManager.unregisterListener(ShakeWakeupService.this);
                 mSensorEventManager.registerListener(ShakeWakeupService.this, mSensor,
                     SensorManager.SENSOR_DELAY_NORMAL);
             }
         }
     };

         @Override
         public void onCreate() {
           super.onCreate();
           Log.v("shake service startup","registering for shake");
           mContext = getApplicationContext();
             // Obtain a reference to system-wide sensor event manager.
           mSensorEventManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
             // Get the default sensor for accel
           mSensor = mSensorEventManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
             // Register for events.
           mSensorEventManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);

             // Register our receiver for the ACTION_SCREEN_OFF action. This will make our receiver
             // code be called whenever the phone enters standby mode.
           IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
           registerReceiver(mReceiver, filter);
     }

     @Override
     public void onDestroy() {
        // Unregister our receiver.
         unregisterReceiver(mReceiver);
         // Unregister from SensorManager.
         mSensorEventManager.unregisterListener(this);
     }

     @Override
     public IBinder onBind(Intent intent) {
         // We don't need a IBinder interface.
  return null;
     }

 public void onShake() {
         //Poke a user activity to cause wake?
     }
     public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //not used right now
            }
            //Used to decide if it is a shake
            public void onSensorChanged(SensorEvent event) {
                    if(event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return;
                  Log.v("sensor","sensor change is verifying");
            }
      }

Řešením pracuje pro mě, ale nebude pracovat ve chvíli, mám screebl chod, což je rys hodně mých uživatelé opravdu chtějí pracovat ve spojení s tím, co jsem vyvíjí.

Odpovězeno 30/01/2010 v 09:44
zdroj uživatelem

hlasů
1

Jen aktualizováno svůj Nexus One s Froyo FRF50 ROM, který byl kopání kolem Internet v posledních několika dnech, a zdá se, že senzory nyní pracovat znovu, když je vypnutá obrazovka, pokud máte PARTIAL_WAKELOCK. Já nevím, jestli to bude dělat to na oficiální verzi, i když chápu, že je to založeno na oficiální verzi, že někteří uživatelé N1 obdržel. Takže možná, že jste změnili svůj názor (opět), a re-umožnil senzory, když je telefon zamknutý. Zkřížené prsty.

Samozřejmě, mohli by prostě jít a zakázat jim opět v 2,2-R1, kdo ví ...

Odpovězeno 23/05/2010 v 23:12
zdroj uživatelem

hlasů
0

Zdá se, že to je otázka 2,1 firmware, že je to nutné, abych si to fixní, ale já jsem musel pracovat ve všech možných řešení pro pokrytí všech verzí.

Byl jsem dávat dohromady seznam telefonů a firmware, které pracují / nefungují / nepravidelně pracovat tak, abychom mohli buď otestovat telefon nebo firmware.

http://apprssd.com/2010/09/08/android-onsensorchanged-not-working-when-screen-lock-is-on/

Pokud máte nový telefon, můžete aktualizovat seznam se, dejte mi vědět.

Odpovězeno 10/09/2010 v 07:10
zdroj uživatelem

hlasů
0

Tam je alternativní řešení (druh), kde budete mít obrazovku vždy zapnuto pomocí:

Settings.System.putInt (getContentResolver (), Settings.System.SCREEN_OFF_TIMEOUT, -1);

To však nebrání tomu, aby uživateli nutit obrazovku vypnout stisknutím tlačítka napájení a poté událost proud senzor zastaví. Také je potřeba oprávnění WRITE_SETTINGS pro tuto práci.

Řešením shora znovu registrace pro události senzorů nefunguje na Droid Eris, který běží Android 2.1 a Neočekává se, že někdy upgrade. Použil jsem následující ačkoli která se objeví v práci. Namísto Zrušením registrace a novou registrací, tento přístup změní obrazovku znovu zapnout, když uživatel vypne, když se vrátí na šedě. V následujícím kódu, popisovač je jen jednoduchý Handler postavena do aktivity (tj Handler manipulátor = nový Handler ()) a mTurnBackOn je zámek probuzení inicializuje na null.

public BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
            // Turn the screen back on again, from the main thread
            handler.post(new Runnable() {
            public void run() {
            if(mTurnBackOn != null)
                mTurnBackOn.release();

                mTurnBackOn = mPwrMgr.newWakeLock(
                    PowerManager.SCREEN_DIM_WAKE_LOCK |
                        PowerManager.ACQUIRE_CAUSES_WAKEUP,
                    "AccelOn");
                mTurnBackOn.acquire();
            }});
        }
    }
};
Odpovězeno 24/10/2010 v 20:19
zdroj uživatelem

hlasů
1

Použití SCREEN_DIM_WAKE_LOCKpracoval pro mě na HTC EVO ..

final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
_WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG");
_WakeLock.acquire();
Odpovězeno 16/11/2011 v 21:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more