¿Cómo puedo saber si la pantalla está activada en Android?

En Android 2.2 (Nivel 7), la función PowerManager.IsScreenOn() devuelve un booleano que es verdadero si la pantalla está encendida y es 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?

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

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

Hay una mejor manera de 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 Display.getState() también puede devolver STATE_DOZE y STATE_DOZE_SUSPEND que significa que la pantalla está encendida de una manera especial. Display.getState() 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() lugar de isScreenOn() , si realmente desea saber el estado de la pantalla, Display.getState() es una mejor opción debido a las condiciones ‘especiales’ que establece la pantalla mientras el dispositivo no es interactivo.

Así es como debes hacerlo:

 PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); boolean result= VERSION.SDK_INT>=VERSION_CODES.KITKAT_WATCH&&powerManager.isInteractive()||VERSION.SDK_INT 

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

Estoy publicando esto porque en un dispositivo HUAWAI Prism II Android 4.1.1 (API 16) el juego en el 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 onDestroy en mi actividad, y luego, mientras la pantalla está apagada, crea mi actividad nuevamente, ¡llamando a 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 transmisió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, compruebo isScreenOn , que es este 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(); } 

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