Autore Topic: Forzare l'accensione dello schermo da un servizio  (Letto 2195 volte)

Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Forzare l'accensione dello schermo da un servizio
« il: 17 Febbraio 2013, 17:25:58 CET »
0
Salve a tutti,

sono qui per chiedervi consiglio.. Sto facendo una piccola (ed in teoria semplice) applicazione che intercetta una chiamata e mi forza lo schermo per farlo rimanere acceso nonostante con il sensore di prossimità il sistema tenda a spegnerlo per evitare che con l'orecchio premi cose a caso..

il servizio quindi in realtà è di tipo broadcast receiver.. ho cercato in giro e gli unici metodi che vedo per mantenere lo schermo acceso sono quelli che usano il wakelock (metodo ormai deprecato) e quelli che utilizzano il metodo consigliato anche dal sito ufficiale cioè:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Questa riga di codice però va usata dentro un'activity .. io invece non ho nessuna activity perchè il mio è un servizio, quindi come faccio ad accendere lo schermo?

Nonostante fosse sconsigliato, poichè ho trovato riferimenti solo a questi due metodi, ho provato ad usare il wake lock ma senza successo, ed ecco quello che sono riuscito a fare:

Codice (Java): [Seleziona]
public class ScreenOn extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            MyPhoneStateListener phoneListener=new MyPhoneStateListener(context);
            TelephonyManager telephony = (TelephonyManager)
            context.getSystemService(Context.TELEPHONY_SERVICE);
            telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
     }
       
        public class MyPhoneStateListener extends PhoneStateListener {
                  Context context;
                  public MyPhoneStateListener(Context context) {
                          this.context = context;
                  }
                  public void onCallStateChanged(int state,String incomingNumber){
                          PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
                          PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "abc");
                          boolean isScreenOn = pm.isScreenOn();
                          wl.acquire(); //Forzo l'accensione dello schermo
                          switch(state){
                                case TelephonyManager.CALL_STATE_IDLE:
                                        //Caso in cui il telefono è a riposo
                                        wl.release(); //Indico che non c'è più bisogno di forzare l'accensione dello schermo
                                        break;
                                case TelephonyManager.CALL_STATE_OFFHOOK:
                                        //Caso in cui la chiamata è in corso
                                        break;
                                case TelephonyManager.CALL_STATE_RINGING:
                                        //Caso in cui il telefono sta squillando
                                        break;
                          }
                  }
        }
} //Fine classe principale

Il fatto è che non funziona, nel senso che l'applicazione non crasha, intercetta correttamente la chiamata ed esegue il codice però ho visto che lo schermo si spegne lo stesso..

qualcuno sa dirmi come mai non funziona? o magari saprebbe consigliarmi un altro metodo che non usi il wake lock?

grazie in anticipo

EDIT:
Sto usando le API Level 8 (android 2.2)
Nel manifest i permessi che ho messo sono questi:
<uses-permission android:name="android.permission.READ_PHONE_STATE">
</uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK">
</uses-permission>
« Ultima modifica: 17 Febbraio 2013, 17:30:31 CET da GregWildfire »

Offline GregWildfire

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildfire
  • Sistema operativo:
    Windows XP
Re:Forzare l'accensione dello schermo da un servizio
« Risposta #1 il: 20 Febbraio 2013, 13:14:35 CET »
0
Sono sempre io, sono riuscito a risolvere parzialmente il problema...

ovvero, ora so come forzare lo schermo a rimanere acceso in normali condizioni, il problema è che non funziona durante una chiamata, perchè non è un vero standby ma è solo uno spegnimento dello schermo "ordinato" dal sensore di prossimità, quindi essendo un "caso speciale" la mia applicazione non funziona.. ormai inizio a pensare che l'unico modo per risolvere il problema lasciando quindi lo schermo acceso anche durante una chiamata sia disattivando il sensore di prossimità...

comunque sia posto il codice che serve (di norma) per accendere il telefono dallo standby:

Codice (Java): [Seleziona]
public void Accendi(){
    PowerManager.WakeLock WakeLock1 = ((PowerManager)getApplicationContext().getSystemService("power")).newWakeLock(268435482, "WAKEUP");
    WakeLock1.acquire();
}

Nel manifest va usato il seguente permesso:
<uses-permission android:name="android.permission.WAKE_LOCK" />

Offline Alberto

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy nexus
  • Sistema operativo:
    windows 7
Re:Forzare l'accensione dello schermo da un servizio
« Risposta #2 il: 22 Agosto 2013, 16:49:57 CEST »
0
Salve, anch'io sto cercando una soluzione a un problema simile, che comunque comporta il risveglio del telefono a seguito di un evento.
Ho provato in vari modi seguendo anche le indicazioni delle API
Codice: [Seleziona]
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
 wl.acquire();
   ..screen will stay on during this section..
 wl.release();

Che è simile a quello postato in precedenza, sono quasi sicuro che questa cosa non si può fare se non si hanno i permessi di root.
tra l'altro mi lancia anche la seguente eccezione.
Codice: [Seleziona]
08-22 16:36:50.390: D/(29917): java.lang.SecurityException: Neither user 10204 nor current process has android.permission.WAKE_LOCK.

"appurato" che non si può riavviare il telefono, è possibile pèerò mantenerlo sempre acceso, chiamando:
Codice: [Seleziona]
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Vorrei sapere come si deve fare per consumare meno energia possibile pur tenendo il display acceso?
Posso mettere la luminosità dello schermo al minimo, e fare lo schermo tutto nero. Serve a qualcosa è possibile fare qualcos'altro?

Alberto
Forse è meglio se apro un altro thread sull'argomento: "consumo energia"?.

Offline matttt

Re:Forzare l'accensione dello schermo da un servizio
« Risposta #3 il: 22 Agosto 2013, 19:25:13 CEST »
0
Sicuro ti serva per forza il display acceso?
Se puoi fare a meno del display prova con un Servizio in background, puoi fare molto anche a telefono lockato e con display spento (e quindi solo con PARTIAL_WAKE_LOCK)
Bound Services | Android Developers
Le mie apps su Google Play Store:

Offline Alberto

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy nexus
  • Sistema operativo:
    windows 7
Re:Forzare l'accensione dello schermo da un servizio
« Risposta #4 il: 27 Agosto 2013, 20:11:42 CEST »
0
Grazie per la risposta e scusa per il ritardo.

Il display serve acceso, ed è essenziale, perché deve far vedere un determinato messaggio a distanza di tempo, ma il messaggio deve essere visivo e non sonoro.
Comunque il problema consumo energia è per me (e penso per molti) importante, riuscire a far consumare poco l'applicazione è determinante, soprattutto se si vuole fare una applicazione utilizzabile per tutto l'orario lavorativo, quindi far durare la batteria per almeno 9-10 ore senza alimentazione.

Se riesco, faccio un confronto fra la durata della batteria con "stratagemmi" anti-consumo e no.
Poi lo posto qui.

Alberto

Offline matttt

Re:Forzare l'accensione dello schermo da un servizio
« Risposta #5 il: 28 Agosto 2013, 18:35:56 CEST »
0
Immagino, il problema è che nella maggior parte dei casi al primo posto nella lista delle risorse che consumano batteria c'è proprio lo schermo :)

Se ti può essere utile questo post non sembra male (anche se non ho provato se effettivamente funziona):
wakelock - Android - Turn off display without triggering sleep/lock screen - Turn on with Touchscreen - Stack Overflow

In pratica una possibilità potrebbe essere di spegnere lo schermo (impostando la luminosità a 0), ma evitare che vada in lock. In modo che quando vuoi tu puoi risvegliarlo. Ovviamente questo scatena una serie di altre problematiche magari... tipo interviene qualche altra app / evento... il telefono si ripristina la luminosità?
Le mie apps su Google Play Store:

Offline Alberto

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy nexus
  • Sistema operativo:
    windows 7
Re:Forzare l'accensione dello schermo da un servizio
« Risposta #6 il: 03 Settembre 2013, 11:24:06 CEST »
0
Ho fatto un test di durata con il mio tablet, che non ha una gran batteria. (passo più tempo a caricarla che a usarla  :-( )

con lo schermo acceso e app in attività, la batteria è durata circa 8 ore  e 30
..acceso al 30 % di luminosità, che comunque è ben visibile

Codice: [Seleziona]
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0.3;
getWindow().setAttributes(params);


mentre "spento" impostando  Brightness a 0 o 0.01. la batteria è durata 9 ore e 45.
uso: 98% display e 2% la mia app (che comunque andava in "background")

Mi attendevo molto di più, una differenza risibile.
 lo schermo in realtà non si spegne mai, diventa solo più scuro, e con il menu poco visibile.

Alla domanda se si ripristina la luminosità?
Si, questa viene ripristinata in maniera automatica da sistema, sia alla chiusura sia quando si va a leggere una notifica o per una chiamata.
Se così non fosse, bisogna pensare di memorizzare tutti i parametri presenti nel telefono prima delle modifiche per poi ripristinarli alla chiusura, ma siccome non è così non bisogna preoccuparsene...(penso)

Cercherò altre opzioni per risparmiare energia.

Alberto



Offline ethack

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC HD2 android 4.0.4
  • Sistema operativo:
    windows 7
Re:Forzare l'accensione dello schermo da un servizio
« Risposta #7 il: 15 Novembre 2013, 19:42:04 CET »
0
salve, a me interesserebbe durante la ricezione di una chiamata e risposta l'inserimento di un pin come se fosse stato inserito da tastiera, sapete consigliarmi qualcosa?