L'accelerometro Android non funziona quando lo schermo è distriggersto

Sto sviluppando un'applicazione per la mia tesi finale sulla scienza informatica e devo raccogliere e registrare i dati dell'accelerometro. Ho bisogno di acquisirlo per un integer giorno, quindi ci sono gravi vincoli di batteria (per esempio, non posso lasciare lo schermo). Inoltre, questa non è un'applicazione mirata a un mercato, quindi è abbastanza accettabile fare una serie di hacking seri, anche a basso livello di codifica C / C ++, se necessario.

È noto che in molti dispositivi gli ascoltatori degli events accelerometrici smettono di generare events quando la schermata si spegne (alcuni collegamenti relativi a questo problema: http://code.google.com/p/android/issues/detail?id=3708 , Accelerometro arresta la consegna di campioni quando lo schermo è spento su Droid / Nexus One anche con WakeLock ). Ho cercato in modo corretto alcune alternative, alcune delle quali includono soluzioni alternative che non funzionano per il mio dispositivo (LG P990, ROM di riserva).

  • Come get il nome della città per Latitude e longitudine in android?
  • Android Widget Lifecycle
  • Dove posso scaricare la versione precedente di SDK Android?
  • Android - Sovrapposizione mappa onTouchEvent / onTap howto?
  • Accesso contestuale in Android
  • Qual è la differenza tra "debug.keystore" e "release.keystore" in Android?
  • Quindi cosa succede è questo: quando si registra un ascoltatore di events per il sensore di accelerometro android in un servizio, funziona bene finché lo schermo non viene spento. Ho già cercato di registrare l'eventListener su un servizio, su un IntentService, cercando di acquisire WakeLocks. Per quanto riguarda i wakelocks, posso verificare che il servizio sia ancora in esecuzione guardando l'output LOGcat, ma sembra che l'accelerometro sia messo in modalità di rest. Una delle soluzioni proposte in alcuni link è quella di annullare la logging e di ri-registrare l'ascoltatore events periodicamente utilizzando il thread di un IntentService come in questo frammento di snippet di codice

    synchronized private static PowerManager.WakeLock getLock(Context context) { if (lockStatic==null) { PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE); lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,NAME); lockStatic.setReferenceCounted(true); } return(lockStatic); } @Override protected void onHandleIntent(Intent intent) { sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(this); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); synchronized (this) { boolean run = true; while (run){ try { wait(1000); getLock(AccelerometerService.this).acquire(); sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(this); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); Log.d("Accelerometer service", "tick!"); } catch (Exception e) { run = false; Log.d("Accelerometer service", "interrupted; cause: " + e.getMessage()); } } } } @Override public void onSensorChanged(SensorEvent event) { Log.d("accelerometer event received", "xyz: "+ event.values[0] + "," + event.values[1] + "," + event.values[2]); } 

    che effettua la chiamata onSensorChange each volta che annulliamo / registriamo l'ascoltatore. Il problema è che l'evento ricevuto contiene sempre gli stessi valori, indipendentemente da me scuotendo il dispositivo.

    Così, in pratica le mie domande sono: (sopportre con me, sto quasi finendo: P)

    1. è ansible avere accesso a basso livello (approccio C / C ++) all'hardware accelerometro SENZA logging ad un ascoltatore di events?

    2. c'è qualche altra soluzione o hack?

    3. qualcuno con un telefono più aggiornato potrebbe testare gentilmente se il problema persiste nel firmware 3.0 e superiori?

    [AGGIORNARE]

    Purtroppo, sembra essere un bug con alcuni cellulari. Ulteriori dettagli nella mia risposta.

    6 Solutions collect form web for “L'accelerometro Android non funziona quando lo schermo è distriggersto”

    In pratica, è un problema con il mio telefono. Altri utenti hanno riferito che questo accade anche con i loro telefoni, da marchi diversi, ma la stessa versione Android. Altre persone non hanno alcun problema, indicando con forza che questo non è un problema con la versione di riserva di android, ma dalle implementazioni di each azienda per i loro driver hardware.

    Ho bisogno di dati costanti accelerometro consegnati e non posso avere un dongle misurare questi dati per me – ho un Arduino con Bluetooth e accelerometro, quindi avrei potuto implementare questa soluzione. Così ho deciso che la soluzione temporanea per il mio cellulare era quella di lasciare lo schermo (inattivo) e ignorare il consumo di batterie. Successivamente eseguirò i test per l'utilizzo della batteria utilizzando un altro telefono Android che funziona con lo schermo spento.

    Ulteriori informazioni sul bug

    Ho studiato alcuni altri e ho trovato rapporti da altri utenti di Android e penso che forse capisco cosa sta succedendo. La libreria libsensors.so che ha i driver per i sensori di telefono non è sviluppata da Google ma da each fornitore di cellulari – ovviamente, perché each cellulare ha il proprio hardware specifico. Google fornisce solo un file di intestazione C in modo che gli sviluppatori sappiano cosa devono implementare. Su alcune implementazioni di questi driver, gli sviluppatori semplicemente spegnono l'accelerometro quando lo schermo si spegne, impedendo così all'ascoltatore degli events del sensore di ricevere nuovi events.

    Ho anche provato questo con CyanogenMod RC7.2 ma non funzionava neanche perché i driver dell'accelerometro sono originali da LG.

    E-mail scambiate con il dipartimento HR di LG

    Ho inviato una e-mail agli sviluppatori del LG P990 e ho finalmente trovato alcune risposte concnetworking! Questo può essere di grande aiuto per alcune persone come me che stanno verificando questi problemi con Android. Ho scritto la seguente domanda

    Ciao! Sto sviluppando la mia tesi in informatica e attualmente sto recuperando dati da hardware dell'accelerometro. Finora ho scoperto che gli accelerometri non trasmettono events quando lo schermo è spento, quindi anche quando prendo un wakelock da uno dei miei programmi, posso verificare che il mio programma sia ancora in esecuzione (tramite l'output di LOGcat), ma non l'evento dell'accelerometro esce. Devo smorzare la schermata (che non posso permettermi, la batteria scarica troppo velocemente) per iniziare a ricevere nuovamente gli events accelerometro. Ho anche provato ad accedervi attraverso il codice C nativo, registrandomi sugli events dell'accelerometro, ma il risultato è stato lo stesso, l'accelerometro non ha gettato alcun valore, anche se stavo ruotando il mio dispositivo. Quindi mi chiedevo se potessi avere accesso diretto all'hardware, con il codice nativo, senza wherer registrarmi ad un ascoltatore. È ansible? Se è così, potresti gentilmente dare ulteriori consigli? Mi piacerebbe molto aiuto! balestruccio

    Per quello che ho ricevuto questa risposta:

    Caro Martin, abbiamo ricevuto la risposta da Dev. Squadra. Hanno detto che non è ansible get l'evento accelerometro mentre lo schermo del telefono è spento. Poiché lo strato HAL non implementava il path sysFS per get events H / W come accelerometro e non esiste alcuna API pubblica per get l'evento. Grazie. I migliori saluti. (Sean Kim)

    Ho quindi inviato una e-mail, dicendo tra l'altro che ho considerato questo un bug, poiché si dovrebbe avere accesso a tutto l'hardware quando si acquista un lock wake:

    […] Ho chiesto questa domanda perché ho alcuni amici che hanno anche telefoni Android con la stessa versione di pan di zenzero, ma da altri marchi di cellulari e alcuni di loro hanno riferito di ricevere events dagli accelerometri quando lo schermo è spento. Ho letto su alcuni forum che questo bug – lo considero un bug, dato che quando acquisisco un Wakelock che mi aspetto di avere qualche elaborazione in corso – dipende dai driver dei sensori che i venditori implementano per i loro cellulari. C'è qualche possibilità che questi driver possano essere aggiornati o sarà corretto questo bug ad un certo punto? Questo mi aiuterà enormemente con il mio lavoro continuo […]

    E poi ho ricevuto questa risposta:

    Nella mia conoscenza da Dev. Team, questo non è bug. Questo è un limite di questo telefono a causa dell'architettura H / W. Dobbiamo ridisegnare l'architettura HAL e il driver per supportre la tua richiesta. Ma, come sapete che è troppo difficile a causa della mancanza di risorse. Stiamo cercando di aiutarti con tutti i nostri sforzi, ma non possiamo supportre la tua richiesta come ho accennato. (Sean Kim)

    Quindi, a quanto pare, sanno di questo, ma non stanno cercando di correggere questo perché non credono che sia un bug – che ancora credo sia un difetto logico – o non hanno il tempo / le risorse per correggerlo.

    Linea inferiore Se si dispone di un cellulare che non invia gli events accelerometro con lo schermo spento, provare ad aggiornare il firmware. Se questo non risolve e si desidera realmente fare un serio hacking, ri-implementa il tuo livello hardware – suggerimento: probabilmente è qualcosa a che fare con libsensors.so.

    Non sono sicuro se questo in realtà ti aiuterà, ma ho trovato un lavoro intorno (non so come bene se aiuterà il risparmio di batteria però).

    Utilizzando bash ho un cat-ing /sys/devices/virtual/accelerometer/accelerometer/acc_file , e quando /sys/devices/virtual/accelerometer/accelerometer/acc_file lo schermo tramite il button di alimentazione, l'output continua, ma viene congelato. (Ho avuto sshd in esecuzione in un chroot quindi l'essere in grado di vederlo.)

    Tuttavia, nell'echo di 0 > /sys/devices/platform/msm_fb.196609/leds/lcd-backlight/brightness . Lo schermo si spegne e l'output è continua.

    Questo è su una SGH-T589W, versione Android 2.3.6.

    Mi sono imbattuto in problemi simili con Samsung Nexus che esegue Android 4.0.2 utilizzando altri servizi di sistema che arrestano / si fermano mentre lo schermo è spento anche se è stato acquisito un PARTIAL_WAKE_LOCK . La mia soluzione era utilizzare un SCREEN_DIM_WAKE_LOCK come in:

      lockStatic = mgr.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,NAME); 

    Sarebbe molto meglio avere lo schermo completamente fuori, ma alless questa soluzione funziona, anche se sarebbe ancora meglio se potrei limitare utilizzando un SCREEN_DIM_WAKE_LOCK solo per i dispositivi / sisthemes operativi che lo richiedono.

    Ho applicato il PARTIAL_WAKE_LOCK e mi ha lavorato come fascino. Testato su OS 5.0, 6.0 e 7.0. Ecco il mio codice per acquisire e rilasciare la chiusura della sveglia. Fare attenzione a aumentare il drenaggio della batteria, in modo da acquisire e rilasciarlo in modo intelligente.

     public void acquireWakeLock() { final PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); releaseWakeLock(); //Acquire new wake lock mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PARTIAL_WAKE_LOCK"); mWakeLock.acquire(); } public void releaseWakeLock() { if (mWakeLock != null && mWakeLock.isHeld()) { mWakeLock.release(); mWakeLock = null; } } 

    Ref: https://developer.android.com/training/scheduling/wakelock.html#cpu

    Sto lavorando ad una predizione sdk, che utilizza i dati dei sensori di dispositivo (accelerometer / giroscopio) e prevede gli events utente. Ho provato lo stesso problema.

    Odio di deludermi, ma alcuni dispositivi non mantengono l'accelerometro mentre sono in modalità di rest. Alcuni fanno, altri non lo fanno. È ansible controllare qualsiasi applicazione di perdita di peso del pedometro in negozio, la maggior parte di essi esplicitamente afferma che ciò non functionrà in alcuni dispositivi.

    Se l'opzione di block parziale non è disponibile per il telefono significa che il driver per il sensore ha triggersto early_suspend .

    Ci sono due opzioni.

    1: Distriggers EARLY_SUSPEND nel driver

    2: Aggiungi un flag di esecuzione che può enable / disable early_suspend funzionalità disable early_suspend a livello di driver.

    ex. cat / sys / module / earlysuspend / sensore 1/0

    IMO la seconda opzione dovrebbe essere stata lì dall'inizio.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.