Desactivar pantalla en Android

Intento encender y apagar la pantalla después de que se produce una determinada acción (solo preocúpese por apagar la pantalla por ahora). Por lo que entiendo de wake lock, esto es lo que tengo:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 

Cuando leo otras publicaciones en stackoverflow y en otro lugar, parecen decirme que PARTIAL_WAKE_LOCK apagará la pantalla. Pero si leo el SDK, dice que solo permitirá que la pantalla se apague. Entonces creo que esto no está bien.

¡Cualquier pista sería útil! Gracias,

Micro

Hay dos opciones para apagar la pantalla:

 PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE); // Choice 1 manager.goToSleep(int amountOfTime); // Choice 2 PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag"); wl.acquire(); wl.release(); 

Probablemente necesites este permiso también:

  

ACTUALIZAR:

Prueba este método; Android apaga la pantalla una vez que el nivel de luz es lo suficientemente bajo.

 WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; params.screenBrightness = 0; getWindow().setAttributes(params); 

Lo siguiente se copia del documento SDK . Si quieres mantener la pantalla encendida, creo que SCREEN_BRIGHT_WAKE_LOCK es suficiente.


 Flag Value CPU Screen Keyboard 

 PARTIAL_WAKE_LOCK On* Off Off SCREEN_DIM_WAKE_LOCK On Dim Off SCREEN_BRIGHT_WAKE_LOCK On Bright Off FULL_WAKE_LOCK On Bright Bright 

Para mí, esos métodos no funcionaron. Así que utilicé otro escenario (no trivial) para apagar mi pantalla.

Android tiene 2 banderas que son responsables de estar despiertos:

  • Pantalla -> Pantalla TimeOut
  • Aplicación -> Desarrollo -> Permanecer despierto mientras se carga la checkbox.

Usé el flujo seguido:

  1. En primer lugar, guarde la configuración anterior, por ejemplo, el tiempo de espera de la pantalla fue de 1 minuto y permanecer despierto mientras se carga .

  2. Después, desactivo Mantenerme despierto mientras estoy cargando y establezco el tiempo de espera de la pantalla en un tiempo mínimo.

  3. Me registro para transmitir el servicio del receptor para obtener el evento de Android esa pantalla apagada.

  4. Cuando desconecté el evento en la pantalla, configuré la configuración anterior de manera predeterminada: el tiempo de espera de la pantalla fue de 1 minuto y permanece despierto mientras se carga .

  5. Eliminar el registro del receptor

Después de 15 seg. el dispositivo duerme

Aquí hay fragmentos de código:

Receptor de radiodifusión

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * Catch Screen On/Off * */ public class BroadcastReceiverScreenListener extends BroadcastReceiver{ private BroadCastListenerCallBackItf mBroadCastListenerCallBack = null; public BroadcastReceiverScreenListener( BroadCastListenerCallBackItf broadCastListenerCallBack) { this.mBroadCastListenerCallBack = broadCastListenerCallBack; } @Override public void onReceive(Context arg0, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { mBroadCastListenerCallBack.broadCastListenerCallBack__ScreenOff_onResponse(); } } } 

Interfaz utilizada como callback

 public interface BroadCastListenerCallBackItf { public void broadCastListenerCallBack__ScreenOff_onResponse(); } 

2 métodos de la clase principal:

 .... AndroidSynchronize mSync = new AndroidSynchronize(); .... public void turnScreenOff(int wait){ IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadCastListenerCallBackItf broadCastListenerCallBack = this; BroadcastReceiver mReceiver = new BroadcastReceiverScreenListener(broadCastListenerCallBack); m_context.registerReceiver(mReceiver, filter); //set Development --> disable STAY_ON_WHILE_PLUGGED_IN Settings.System.putInt( m_context.getContentResolver(), Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0 ); // take current screen off time int defTimeOut = Settings.System.getInt(m_context.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 3000); // set 15 sec Settings.System.putInt(m_context.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 15000); // wait 200 sec till get response from BroadcastReceiver on Screen Off mSync.doWait(wait*1000); // set previous settings Settings.System.putInt(m_context.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, defTimeOut); // switch back previous state Settings.System.putInt( m_context.getContentResolver(), Settings.System.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_USB); m_context.unregisterReceiver(mReceiver); } public void broadCastListenerCallBack__ScreenOff_onResponse() { mSync.doNotify(); } .... 

Clase AndroidSynchronize

 public class AndroidSynchronize { public void doWait(long l){ synchronized(this){ try { this.wait(l); } catch(InterruptedException e) { } } } public void doNotify() { synchronized(this) { this.notify(); } } public void doWait() { synchronized(this){ try { this.wait(); } catch(InterruptedException e) { } } } } 

[EDITAR]

Necesita registrar el permiso:

 android.permission.WRITE_SETTINGS 

Según este enlace , también puede apagar la pantalla de esta manera:

 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); 

1000 está en milisegundos, lo que significa 1 segundo, puede reemplazarlo con cualquier valor que desee.

Permiso necesario:

  

try – wakeLock.acquire (1000); // especifica la hora, se oscurece y finalmente se apaga.