2012-04-21 17 views
14

Per questa domanda che sto per citare un altro utente che ha ottenuto alcuna risposta alla loro domanda:controllare l'utilizzo del tasto del volume quando lo schermo è spento

Ho scritto un app Andoid che utilizza i pulsanti hardware del volume per un altro scopo.

Funziona correttamente se l'app è in esecuzione e visibile, ma quando si spegne lo schermo o si interrompe, il pulsante clic non entra nei miei gestori .

Qualcuno sa se c'è un modo per rilevare questi clic sui pulsanti quando lo schermo è spento? Fonte: AV695's question

sto lavorando su un app me stesso che fa uso dei pulsanti del volume, ma come questo utente ha anche osservato, il comportamento normale di controllo pulsanti con onkeypress smette di funzionare una volta che lo schermo è spento. Questo perché l'attività viene messa in pausa sullo schermo spento.

C'è un modo per mantenere l'attività in esecuzione mentre lo schermo è spento, o controllare l'utilizzo dei pulsanti del volume quando lo schermo è spento? Ho provato a utilizzare un servizio per questo prima, ma è impossibile controllare le chiavi del volume come quelle indicate da Commonsware.

+0

Avete qualche esempio di qualcosa che sembra fare questo, il che suggerirebbe che sia persino possibile? Al di fuori del caso limite in cui la CPU dell'applicazione è in esecuzione ma lo schermo è spento, c'è qualche indicazione che il kernel si sveglia e viene informato del fatto che il tasto è stato premuto? Se non fosse necessario hardware o almeno mods di firmware radio. Solo se/quando il kernel è a conoscenza dell'evento chiave potrebbe diventare un problema nel persuadere la piattaforma a farla conoscere al suo codice. –

+0

Purtroppo no. L'unica cosa che riesco a pensare sono i mediaplayer. Sto iniziando a credere che la mia idea, per quanto sia semplice (controlla le notifiche senza dover togliere il telefono dalla tasca, semplicemente premendo il pulsante del volume che farà vibrare il tuo dispositivo se hai notifiche in sospeso) è semplicemente troppo complesso da creare. –

+0

Il LED di solito non lampeggia se hai nuove notifiche nella barra di stato, incluse quelle personalizzate da app di terze parti? –

risposta

6

dubito che questo è supportato (senza ricorrere a un Wakelock batteria drenante) sia con la piattaforma, kernel, o livelli firmware Radio sottostanti senza modifiche fino all'ultimo per portare il volume preme durante il sonno all'attenzione del kernel.

Nell'ambito delle modifiche ragionevoli della ROM di sistema, uno più ragionevole potrebbe essere quello di modificare una ROM open source esistente affinché il dispositivo inserisca un codice a livello di piattaforma personalizzato nella gestione del pulsante di alimentazione solitamente utilizzato per riattivare il dispositivo. dispositivo preparatorio per sbloccarlo - che almeno sappiamo attirare l'attenzione del kernel. Quel codice potrebbe quindi informare l'utente con suoni o vibrazioni se ci sono notifiche non riconosciute.

Si può opzionalmente attendere brevemente, controllare l'orientamento del dispositivo o cercare un altro tasto premuto per evitare di farlo in un modo fastidioso quando l'utente tiene il dispositivo fuori dalla tasca e tenta di sbloccarlo.


O non era possibile utilizzare il tasto del volume e solo impostare un timer per svegliarsi ogni 15 minuti e vibrare se ci sono notifiche non riconosciute, evitando la necessità di armeggiare in quelle tasche.


di cui parli è una richiesta personalizzata: se implica che sia uno spento o basso volume, un'altra opzione da considerare è che alcuni fornitori hanno "orologi Bluetooth" con uno SDK che consente di notifiche push da un dispositivo Android.

Se è possibile acquisire la notifica quando viene generata, è possibile spingerla al polso dell'utente e quindi lasciare che il telefono ritorni in modalità sospensione.

+3

Grazie per l'ampio commento. Tristemente penso che smetterò di pensare a questo piccolo progetto e andare avanti, magari riprovarlo nel lontano futuro dove cose come questa sono un po 'più semplici. Era uno di quei "Gee, sai cosa sarebbe bello?" tipo di idee da un estraneo in linea casuale, quindi penso che l'idea dell'orologio bluetooth è un po 'troppo. Grazie per l'idea però :) –

+0

Come lo faresti quando in realtà si ricorre a un wake-lock? Mi sembra che una volta spento lo schermo, l'attività venga messa in pausa e non vengano consegnate le chiavi? – ondra

2

Non è possibile intercettare il tasto mentre l'applicazione è in background, ma invece di ascoltare lo stesso KeyPress. È possibile registrare un ContentObserver, come descritto in this question.

0

Come menzionato da Chris Stratton, l'unico modo per mantenere in vita la tua app è utilizzando le scosse della batteria che drenano la batteria.

Tuttavia, poiché mi sono trovato nella stessa situazione, ho trovato un'altra soluzione. Sfortunatamente, avrai bisogno di un dispositivo rooted e del framework Xposed.

Con Xposed, che sostituisce il processo zygot in modo da poterti agganciare a qualsiasi costruttore e metodo del sistema, sarai in grado di catturare i KeyEvents non elaborati prima che il sistema li gestisca.

Questo è fatto in PhoneWindowManager.interceptKeyBeforeQueueing(). Usando un XC_MethodHook, puoi usare beforeHookedMethod() sul metodo sopra menzionato per catturare ogni evento del pulsante hardware, anche se il dispositivo è in stato di sospensione profonda.

Dopo aver catturato gli eventi a cui sei interessato, puoi creare un blocco di attivazione temporaneo per fare le tue cose, ma non dimenticare di rilasciare il blocco della sveglia dopo aver terminato il lavoro.

Un buon esempio di come ottenere ciò è il modulo Xposed Torch. Se si fa affidamento su un sistema non root, la cattiva notizia è che semplicemente non è possibile senza svuotare la batteria ...

0

Stavo anche provando a implementare il rilevamento della pressione dei tasti del volume nella mia app e l'ho lasciato parte da sviluppare più tardi una volta completata la parte principale. Sono stato in grado di rilevare la pressione del tasto del volume mentre lo schermo è acceso anche quando il telefono è bloccato, da un servizio in background.

Background Video Recorder 2 (BVR2) (e possibile anche BVR1, non l'ho provato) è una delle app in grado di rilevare la pressione del tasto del volume anche quando lo schermo è spento. Durante il tentativo di implementare il rilevamento dei tasti del volume mentre lo schermo è spento nella mia app, ho installato BVR2, sperando di scoprire come funziona. Con mia sorpresa ha dato alla mia app la capacità di rilevare i tasti del volume anche quando lo schermo è spento. La mia app aveva un ContentObserver per monitorare le modifiche al volume, ma non funzionava quando lo schermo era spento. Quando BVR2 è attivo, la mia app può anche rilevare la pressione del tasto del volume quando lo schermo è spento. Sto ancora scavando.

Ma BVR2 ha una propria azione di trigger, ovvero registrare video, un'azione che non si desidera eseguire solo per il piacere dell'applicazione che rileva la pressione del tasto del volume.

Un'altra app è QuickClick. Questa app può dare alla tua app quello che manca, il potere di rilevare la pressione dei tasti del volume anche quando lo schermo è spento, senza ulteriori azioni indesiderate. Basta installare QuickClick e non configurare alcuna azione. Crea un ContentObserver per monitorare le modifiche del volume dello streaming e sei pronto. Ora l'app sarà in grado di rilevare la pressione dei tasti del volume anche quando lo schermo è spento.

Si noti che la mia app funziona come servizio in background.

Entrambe le app sopra menzionate sono destinate ad altri usi, ma utilizzano il rilevamento del tasto del volume per eseguire azioni. Non sono in alcun modo collegato a nessuna delle app menzionate.

Se queste app, e forse altre decine, possono rilevare la pressione del tasto del volume, è possibile farlo.Chiedo agli esperti di scoprire come farlo, in modo che possiamo implementare nella nostra app senza fare affidamento su un'altra app.

Se trovi utile questa risposta, si prega di votare.

Problemi correlati