2010-03-19 13 views
24

En Android 2.2 (nivel 7), la función PowerManager.IsScreenOn() devuelve un booleano que es verdadero si la pantalla está encendida y falso si la pantalla está apagada. Estoy desarrollando código para Android 1.5 (Nivel 3). ¿Cómo realizo la misma tarea en versiones anteriores de Android?¿Cómo puedo saber si la pantalla está activada en Android?

No quiero activar o desactivar la pantalla en mi código. Solo quiero saber de qué se trata.

Respuesta

9

Puede lograr esto configurando los receptores de difusión para ACTION_SCREEN_ON y ACTION_SCREEN_OFF.

54

Hay una forma mejor que usar 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; } 

Tenga en cuenta que también puede devolver Display.getState()STATE_DOZE y STATE_DOZE_SUSPEND lo que significa que la pantalla está encendida de una manera especial. Más información sobre Display.getState() y sus valores de retorno aquí: http://developer.android.com/reference/android/view/Display.html#getState()

También tenga en cuenta que aunque la documentación oficial recomienda el uso de isInteractive() en lugar de isScreenOn(), si realmente quiere saber el estado de la pantalla, Display.getState() es una mejor opción debido a la 'especial 'condiciones que establece la pantalla mientras el dispositivo no es interactivo.

+0

Gracias hermano, eso es todo! :) – cesarferreira

+10

return powerManager.isScreenOn(); –

+0

Sí @Sponge, es mejor para ti, el condicional solo fue para aclararlo un poco más para desarrolladores sin experiencia simplemente porque la mayoría de ellos en lugar de usar 'return true 'agregará su propio código. –

22

Esta es la forma en que debe hacerlo:

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

Elegant as f. .. –

+0

Bueno. Gracias. – MegaAppBear

2

les dejo esto porque en un Huawai Prism II Android 4.1.1 (API 16) dispositivo de juego que estoy trabajando (http://www.playlunapuma.com) tuvo el siguiente comportamiento molesto:

Estoy mostrando mi menú principal que tiene algo de animación en un SurfaceView y reproduce un sonido de vez en cuando. El dispositivo se queda inactivo, se atenúa y luego se apaga. Llama a onDestroy en mi actividad, y luego mientras la pantalla está apagada crea mi actividad nuevamente, llamando al onCreate! Entonces, el problema es que mis animaciones y sonidos se reproducen mientras la pantalla está apagada. Lo que realmente quiero que suceda es que mi ciclo de animación no se ejecute en absoluto si la pantalla está apagada. Los receptores de difusión no funcionan porque no puedo almacenar el estado desde la última vez que se apagó la pantalla. Pensé en algunos hacks que involucraban booleanos estáticos, pero parecía un kluge que no funcionaba y tenía casos extremos horribles. La pantalla ya está apagada cuando se crea mi actividad nuevamente, por lo que no recibiré un evento a través del receptor de transmisión que indique que mi pantalla está apagada.

Lo resolví utilizando un receptor de emisión y el código enumerado anteriormente.

En mi onCreate, creo el receptor de difusión. Esto controlará mi ciclo de animación cuando la pantalla se encienda y apague.

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); 
     } 
    } 

} 

En mi controlAnimLoop, puedo comprobar isScreenOn, que es el código:

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

estoy usando la siguiente función:

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

Creo que deberías usar 'switch (arg1.getAction()) {/ * content * /}' en lugar de bloques 'if else' – NatNgs

Cuestiones relacionadas