ho bisogno di avvertire l'utente di alcuni eventi per mezzo di:Come mantenere il vibratore all'infinito da un servizio o un ricevitore
- vibrazioni
- notifica
La vibrazione dovrebbe rimanere su indefinitamente finché l'utente non accetta la notifica.
Il problema è la vibrazione si interrompe quando il dispositivo va in stop. Ho letto le seguenti domande:
Allow phone to vibrate when screen turns off
Continue vibration even after the screen goes to sleep mode in Android
C'era an answer a una delle domande sopra menzionate dicendo che vibra senza modelli ha fatto il trucco. Così ho provato a chiamare la versione di Vibrator.vibrate
che accetta i millisecondi anziché un modello con un numero elevato ma la vibrazione si arresta comunque.
Altre risposte suggeriscono di registrare un ricevitore sull'azione ACTION_SCREEN_OFF
. Ciò mi consentirebbe di riprendere le vibrazioni se il dispositivo si mette in stato di riposo dopo l'avvio dell'allarme, ma non funzionerà se il dispositivo è già stato dormito.
Tuttavia, potrei far funzionare la cosa se prima potessi accendere lo schermo, quindi registrare il ricevitore per gestire qualsiasi evento di schermo che potrebbe accadere da lì in poi. Quindi ho provato ad acquisire un wake lock completo quando viene ricevuto l'evento di attivazione, prima di avviare il suono o la vibrazione, ma non funziona nonostante io stia utilizzando i flag FULL_WAKE_LOCK e ACQUIRE_CAUSES_WAKEUP. La parte di attivazione funziona, ma subito dopo il dispositivo torna a dormire. Mi piacerebbe pensare che il flag FULL_WAKE_LOCK non funzioni perché è stato deprecato in API 17, ma il mio dispositivo è un Samsung in esecuzione 4.1.2 che è API 16!
L'approccio consigliato sembra essere quello di utilizzare WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ma questo dovrebbe essere chiamato da un'attività, e non ho alcuna schermata fino a quando l'utente non fa clic nella notifica, e se ciò accade il suono e la vibrazione dovrebbero già avere stato fermato
Quindi sembra un vicolo cieco.
Cos'altro potrei provare?
AGGIORNAMENTO:
Non ho avuto fortuna a mantenere lo schermo sempre acceso con i lucchetti, ma d'altra parte mi consentono di accendere lo schermo anche solo per pochi secondi. In realtà non ho bisogno di tenere lo schermo acceso, quindi sto registrando il ricevitore sull'azione Intent.ACTION_SCREEN_OFF
, e quando lo schermo si spegne, il ricevitore riprende a vibrare. Questo ha funzionato bene nel Samsung, ma ora sono passato a un Huawei per continuare i test e il ricevitore non funziona.
UPDATE:
Ecco la traccia dello stack dell'eccezione nel dispositivo Huawei:
java.util.NoSuchElementException: Death link does not exist
at android.os.BinderProxy.unlinkToDeath(Native Method)
at com.android.server.VibratorService.unlinkVibration(VibratorService.java:294)
at com.android.server.VibratorService.removeVibrationLocked(VibratorService.java:284)
at com.android.server.VibratorService.cancelVibrate(VibratorService.java:213)
at android.os.IVibratorService$Stub.onTransact(IVibratorService.java:83)
at android.os.Binder.execTransact(Binder.java:338)
at dalvik.system.NativeStart.run(Native Method)
Queste sono in realtà le mie bandiere, ad eccezione di "ON_AFTER_RELEASE", di cui non ho bisogno. E ciò che accade in questo Samsung è che in realtà si accende, ma dopo 1 o 2 secondi si spegne di nuovo senza che io abbia rilasciato il blocco. Non importa ora, perché in realtà non ho bisogno dello schermo tutto il tempo. Pubblicherò una risposta spiegando cosa ho fatto. –
ok, aspettando la tua risposta, sono curioso. – Nexowski
Appena pubblicato. –