2010-03-19 17 views
24

In Android 2.2 (Livello 7) la funzione PowerManager.IsScreenOn() restituisce un valore booleano vero se lo schermo è acceso e falso se lo schermo è spento. Sto sviluppando il codice per Android 1.5 (Livello 3). Come faccio a svolgere lo stesso compito nelle versioni precedenti di Android?Come posso sapere se lo schermo è acceso su Android?

Non voglio accendere o spegnere lo schermo nel mio codice. Voglio solo sapere di cosa si tratta.

risposta

9

È possibile eseguire questa operazione impostando ricevitori di trasmissione per ACTION_SCREEN_ON e ACTION_SCREEN_OFF.

54

C'è un modo migliore di utilizzare BroadcastReceivers:

// If you use API20 or more: 
DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); 
for (Display display : dm.getDisplays()) { 
    if (display.getState() != Display.STATE_OFF) { 
     return true; 
    } 
} 
return false; 

// If you use less than API20: 
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
if (powerManager.isScreenOn()){ return true; } 

noti che Display.getState() inoltre possibile tornare STATE_DOZE e STATE_DOZE_SUSPEND il che significa che lo schermo è acceso in modo particolare. Maggiori informazioni Display.getState() ed i suoi valori di ritorno qui: http://developer.android.com/reference/android/view/Display.html#getState()

Si noti inoltre che, anche se la documentazione ufficiale consiglia di utilizzare isInteractive() invece di isScreenOn(), se si vuole veramente conoscere lo stato dello schermo, Display.getState() è una scelta migliore a causa della 'speciale 'condizioni che attivano lo schermo mentre il dispositivo non è interattivo.

+0

Grazie bro, è questo! :) – cesarferreira

+10

return powerManager.isScreenOn(); –

+0

Sì @Sponge, è meglio la tua strada, il condizionale era solo per chiarirlo un po 'di più per gli sviluppatori inesperti solo perché la maggior parte di loro invece di usare 'return true' aggiungerà il proprio codice. –

22

Questo è come si dovrebbe fare:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
boolean result= VERSION.SDK_INT>=VERSION_CODES.KITKAT_WATCH&&powerManager.isInteractive()||VERSION.SDK_INT<VERSION_CODES.KITKAT_WATCH&&powerManager.isScreenOn(); 
return result; 
+9

Elegante come f. .. –

+0

Bello. Grazie. – MegaAppBear

2

sto postando questo perché su un Huawai Prism II Android 4.1.1 (API 16) dispositivo di gioco su cui sto lavorando (http://www.playlunapuma.com) ha avuto il seguente comportamento fastidioso:

Sto visualizzando il mio menu principale che ha qualche animazione in un SurfaceView e riproduce un suono una volta ogni tanto. Il dispositivo diventa inattivo, si oscura e quindi si spegne. Chiama onDestroy sulla mia attività e quindi mentre lo schermo è spento. crea di nuovo la mia attività, chiamando onCreate! Quindi il problema è che le mie animazioni e suoni stanno giocando mentre lo schermo è spento. Quello che voglio davvero succedere è che il mio ciclo di animazione non funzioni affatto se lo schermo è spento. I ricevitori broadcast non funzionano perché non riesco a memorizzare lo stato dall'ultima volta in cui lo schermo si è spento. Ho pensato ad alcuni hack che coinvolgono i booleani statici, ma mi è sembrato un kluge che potrebbe non funzionare e avere orribili casi limite. Lo schermo è già spento quando la mia attività viene creata di nuovo, quindi non ricevo un evento attraverso il ricevitore broadcast che il mio schermo è spento.

Ho risolto questo problema utilizzando sia un ricevitore broadcast che il codice sopra elencati.

Nel mio onCreate, creo il destinatario della trasmissione. Questo controllerà il mio ciclo di animazione quando lo schermo si accende e si spegne.

if (mScreenReceiver == null) { 
    mScreenIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    mScreenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF); 
    mScreenReceiver = new ScreenReceiver(); 
    registerReceiver(mScreenReceiver, mScreenIntentFilter); 
} 
public class ScreenReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {     
      controlAnimLoop(false, false, true); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      controlAnimLoop(false, false, false); 
     } 
    } 

} 

Nel mio controlAnimLoop, controllo isScreenOn, che è questo codice:

private boolean isScreenOn() { 
    if (android.os.Build.VERSION.SDK_INT >= 20) { 
     // I'm counting                             
     // STATE_DOZE, STATE_OFF, STATE_DOZE_SUSPENDED                     
     // all as "OFF"                             

     DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); 
     for (Display display : dm.getDisplays()) { 
      if (display.getState() == Display.STATE_ON || 
       display.getState() == Display.STATE_UNKNOWN) { 
       return true; 
      } 
     } 

     return false; 
    } 

    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 

    return powerManager.isScreenOn(); 
} 
4

sto usando la seguente funzione:

public boolean isInteractive() { 
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH 
     ? powerManager.isInteractive() 
     : powerManager.isScreenOn(); 
} 
0

MainActivity. Java

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_HEADSET_PLUG); 
     filter.addAction(Intent.ACTION_POWER_CONNECTED); 
     filter.addAction(Intent.ACTION_POWER_DISCONNECTED); 
     filter.addAction(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 

     registerReceiver(new MyReceiver(), filter); 
    } 
} 

MyReciever.Java

public class MyReceiver extends BroadcastReceiver { 

    MainActivity mActivity; 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 

     mActivity = (MainActivity) arg0; 

     TextView tv = (TextView)mActivity.findViewById(R.id.textView1); 

     if(arg1.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { 
      tv.setText("Headset Plugin "); 
     } else if(arg1.getAction().equals(Intent.ACTION_POWER_CONNECTED)) { 
      tv.setText("Power Connected "); 
     } else if(arg1.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) { 
      tv.setText("Power Disconnected "); 
     } else if(arg1.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      tv.setText("Screen ON "); 
     } else if(arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      tv.setText("Screen OFF "); 
     } 
    } 
} 
+0

Penso che dovresti usare 'switch (arg1.getAction()) {/ * content * /}' invece di blocchi 'if else' – NatNgs

Problemi correlati