2010-10-10 8 views
30

Me gustaría bloquear la pantalla. Quiero desactivar la tecla de inicio y solo usar la tecla de retroceso. ¿Cómo logro esto?Cómo deshabilitar la clave de inicio

+2

vea aquí, la respuesta rápida parece que necesita implementar un reemplazo de pantalla de inicio: http://stackoverflow.com/questions/3953689/how-to-lock-android-buttons-phone-from-code-screen- bloquear http://stackoverflow.com/questions/2162182/android-is-it-possible-to-disable-the-click-of-home-button/3955217#3955217 http://stackoverflow.com/questions/3724509/ yendo a casa-pantalla-programáticamente http://www.toddlerlock.com/3.html – mishkin

+0

Hola ... Tienes la solución. También estoy tratando de deshabilitar la tecla de inicio para mi aplicación de pantalla de bloqueo, pero no está funcionando. –

Respuesta

29

Utilice este método para inhabilitar la tecla Inicio en el androide

@Override 
public void onAttachedToWindow() { 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
    super.onAttachedToWindow(); 
} 
+4

¿Funciona esto con una pantalla completa SurfaceView y MediaPlayer? Parece que no. Oh, lo tengo: en este caso, TYPE_KEYGUARD_DIALOG funciona. – Yar

+0

El usuario aún podrá deslizarse hacia abajo en la Barra de notificaciones ... y una vez que la barra esté baja, puede hacer clic en Inicio y funcionará. – MindWire

+0

¿Lo has probado? No creo que la barra de notificación funcione. – ASH

22

Encontré una manera de abordar la tecla HOME. Para su aplicación establezca el manifiesto como

<action android:name="android.intent.action.MAIN" />    
<category android:name="android.intent.category.HOME" />     
<category android:name="android.intent.category.DEFAULT" />    
<category android:name="android.intent.category.MONKEY"/> 

Ahora su aplicación es una aplicación Launcher alternativo.

Utilice el BAD, y desactivar el lanzador de aplicaciones usando el gestor de paquetes

pm disable com.android.launcher2 

Ahora la prensa tecla de inicio permanecerá siempre en la misma pantalla.

+0

puede dar más códigos o demostración gracias – pengwang

+0

si lo pruebo correcto, recibiré su respuesta – pengwang

+1

pm inhabilitar com.android.launcher2 debe ser pm desactivar com.android.launcher – kakopappa

12

Esta solución funciona hasta 3.x solamente.

Bien, se suponía que esta era una pregunta difícil. Pero aquí hay una manera de resolverlo.

reemplazar el método de abajo en su actividad,

@Override 
public void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   
} 

Y ahora controlar el evento clave de esta manera,

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_HOME) 
    { 
    Log.i("Home Button","Clicked"); 
    } 
    if(keyCode==KeyEvent.KEYCODE_BACK) 
    { 
     finish(); 
    } 
return false; 
} 
+0

En el sentido ideal ... NUNCA se devolverá KEYCODE_HOME a ninguna aplicación. – JoxTraex

+0

¡No funciona! – dd619

+4

Mi aplicación falla con esto: java.lang.IllegalArgumentException: el tipo de ventana no se puede cambiar después de agregar la ventana. –

0

Para desactivar el botón de inicio, intente esto:

@Override 
public void onAttachedToWindow() { 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
    super.onAttachedToWindow(); 
} 

El problema con la barra de notificaciones puede resolverse ocultando la barra de notificaciones como aquí:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.xxxx); 
    getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN); 
    .... 
} 

o establecer el tema de pantalla completa para su actividad o aplicación en el manifiesto:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
4

Añadir este código a la clase MainActivity:

Timer timer; 
MyTimerTask myTimerTask; 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (timer != null) { 
     timer.cancel(); 
     timer = null; 
    } 
} 

@Override 
protected void onPause() 
{ 
    if (timer == null) { 
     myTimerTask = new MyTimerTask(); 
     timer = new Timer(); 
     timer.schedule(myTimerTask, 100, 100); 
    } 

    super.onPause(); 
} 

private void bringApplicationToFront() 
{ 
    KeyguardManager myKeyManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE); 
    if(myKeyManager.inKeyguardRestrictedInputMode()) 
     return; 

    Log.d("TAG", "====Bringging Application to Front===="); 

    Intent notificationIntent = new Intent(this, MainActivity.class); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
    try 
    { 
     pendingIntent.send(); 
    } 
    catch (PendingIntent.CanceledException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public void onBackPressed() { 
    // do not call super onBackPressed. 
} 

class MyTimerTask extends TimerTask { 
    @Override 
    public void run() { 
     bringApplicationToFront(); 
    } 
} 

No es un bloqueo para el botón de 'casa' , pero el usuario no puede cambiar a otra aplicación durante mucho tiempo (más de 100 milisegundos), tal vez esto es lo que quiere.

Cuestiones relacionadas