Anular el botón de encendido como el botón de inicio

Bueno, estoy haciendo algo en el que quiero desactivar todos los botones duros del dispositivo.

Botones duros como Potencia, Casa, Subir volumen, Bajar volumen, Buscar, Atrás.

He superado con éxito casi todos los botones aquí, excepto Power.

Así que sólo quiero que la gente vea y por favor comparta algunas ideas para que yo pueda conseguir con ella.

Estoy recibiendo el keyevent largo de la prensa en onDispatchKeyEvent() , de la misma manera que quiero coger el tecleo corto del mismo. Por otra parte al presionar la energía también intenté parar la pantalla apagado consiguiendo la Broadcast de SCREEN_OFF y conseguí recibirla pero no podía manejarla.

Gracias.

Entonces, había creado un ReceiverScreen que recibe la difusión de la pantalla encendido / apagado

ReceiverScreen.java

 public class ReceiverScreen extends BroadcastReceiver { public static boolean wasScreenOn = true; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { // do whatever you need to do here wasScreenOn = false; } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { // and do whatever you need to do here wasScreenOn = true; } } } 

DisableHardButton.java

 public class DisableHardButton extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver mReceiver = new ReceiverScreen(); registerReceiver(mReceiver, filter); } @Override protected void onPause() { // when the screen is about to turn off if (ScreenReceiver.wasScreenOn) { // this is the case when onPause() is called by the system due to a screen state change System.out.println("SCREEN TURNED OFF"); } else { // this is when onPause() is called when the screen state has not changed } super.onPause(); } @Override protected void onResume() { // only when screen turns on if (!ScreenReceiver.wasScreenOn) { // this is when onResume() is called due to a screen state change System.out.println("SCREEN TURNED ON"); } else { // this is when onResume() is called when the screen state has not changed } super.onResume(); } } 

Uf. Esta es una cuestión muy discutida, con muchos comentarios detrás de ella.

Permítanme empezar por reformular su pregunta un poco. Si entiendo claramente, desea desactivar todos los botones físicos del dispositivo durante la duración de su actividad. Esto incluye el botón de encendido, que detecta al manejar la intención ACTION_SCREEN_OFF . Su solución actual (exitosa) para este escenario es difundir un ACTION_SCREEN_ON , ACTION_SCREEN_ON la pantalla cuando se apague, siempre que el host lo implemente correctamente.

Ahora te gustaría ir más allá, haciendo que esta acción sea innecesaria, si (y sólo si) eres capaz de capturar y manejar ACTION_SCREEN_OFF antes de ser enviado al sistema. ¿Es posible? y si lo es, cómo?

Esto tiene alguna discusión. La versión corta, sin embargo, es simple: esto no es posible, sin una modificación personalizada de su firmware o el núcleo del sistema operativo Android, para un número limitado de dispositivos.

El sistema Android, en la medida en que está documentado, define esto como una acción de difusión . Siguiendo el patrón de publicación-suscripción de la propagación de mensajes, este mensaje notificará a todas las partes interesadas de esta acción. Debido a que este mensaje es enviado por el sistema, porque la pila de mensajes es administrada por el sistema y porque el mensaje también es recibido por el sistema, su código simplemente no se inyecta en el lugar correcto para bloquear la recepción de este mensaje.

Además, para algunos dispositivos, este será un switch físico que no tiene interrupción programática alguna. En el mejor de los casos, el sistema Android puede esperar manejar para el evento cuando sucede, que es precisamente por qué este mensaje de difusión es algo así como un caso especial en la pila de servicios. A mi leal saber y entender y sobre la base de la escasa documentación de este escenario, es por eso que no se trata de una característica compatible con el sistema, antes de considerar alguno de los posibles vectores de abuso.

Su mejor recurso es en realidad mucho más simple, si tiene la capacidad de modificar el hardware físico para el dispositivo en cuestión: restringir el acceso a, mangle, o desactivar el botón de alimentación física. En muchos escenarios esto es indeseable, pero esto funciona en situaciones donde su dispositivo Android se está utilizando, por ejemplo, como un punto de venta o una máquina de servicio público. Si esto no es factible, es posible que se apliquen restricciones físicas al acceso al botón de encendido, ya que se ACTION_SCREEN_ON el resto de casos (por ejemplo, intentos puntuales de alternar la pantalla) enviando ACTION_SCREEN_ON .

Sólo recuerde, esta estrategia no es infalible. Hacer esto de manera competente y documentar el procedimiento bien, a fin de que se convierten en forraje para el próximo 2600 exposé .

Mucha suerte con su aplicación.

Por el contrario a todas las respuestas .. Compruebe esto:


 @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) { Log.i("", "Dispath event power"); Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); return true; } return super.dispatchKeyEvent(event); } 

Que hace:

Siempre que el usuario presione el botón de encendido. Cancelamos el Diálogo antes de que lo vean !! :). Esto funciona para mí .. (Probado en la nota2)

Esto es lo que he hecho:

(1) Cree una clase de receptor:

 public class ScreenReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action) { case Intent.ACTION_SCREEN_OFF: BaseActivity.unlockScreen(); break; case Intent.ACTION_SCREEN_ON: // and do whatever you need to do here BaseActivity.clearScreen(); } } } 

(2) Los dos métodos que se llaman anteriormente se parecía a esto:

 public static void unlockScreen () { if (current == null) return; Log.i( Constants.TAG, "Turning on screen ... " ); Window window = current.getWindow(); window.addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD ); window.addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED ); window.addFlags( WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON ); } public static void clearScreen () { if (current == null) return; Log.i( Constants.TAG, "Clearing screen flag when on ... " ); Window window = current.getWindow(); window.clearFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD ); window.clearFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED ); window.clearFlags( WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON ); } private static BaseActivity current; @Override protected void onResume () { current = this; } 

(3) En la clase de actividad principal método onCreate () registre el receptor:

  IntentFilter filter = new IntentFilter( Intent.ACTION_SCREEN_ON ); filter.addAction( Intent.ACTION_SCREEN_OFF ); registerReceiver(new ScreenReceiver(), filter); 

Usted puede llegar a conocer sobre la prensa del botón de encendido, pero no creo que llegará a anularlo y usted será capaz de descartar el diálogo para apagar y mostrar algo más.

Esto es lo que he intentado,

 package com.easylogs.app; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; public class CloseSystemDialogsIntentReceiver extends BroadcastReceiver { public void onReceive(final Context context, final Intent intent) { Log.i("HERE", "------------------------------------HERE"); Toast.makeText(context, "OFFFFFFFFFFFFFFFF",Toast.LENGTH_LONG).show(); } } 

Y declaración en Manifiesto como,

  <receiver android:name="CloseSystemDialogsIntentReceiver"> <intent-filter> <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> 
 @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) { return true; } return super.dispatchKeyEvent(event); } 

¿Has probado el código anterior donde podemos manejar el evento clave de energía. También echa un vistazo a este LINK que ha manejado el botón de encendido presionado evento.

Sé que es demasiado tarde, pero puede ser útil para otros desarrolladores en el futuro. Probado en Android N. Referencia desde https://stackoverflow.com/a/15828592/1065357

  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(!hasFocus) { Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.