web-dev-qa-db-fra.com

Comment désactiver la clé d'accueil

Je voudrais verrouiller l'écran. Je souhaite désactiver la touche home et utiliser uniquement la touche retour. Comment est-ce que j'accomplis ceci?

34
pengwang

Utilisez cette méthode pour désactiver la clé d'accueil dans Android

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

J'ai trouvé un moyen d'aborder la touche HOME. Pour votre application, définissez le manifeste comme

<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"/>

Maintenant, votre application est une application de lancement alternative.

Utilisez l'adb et désactivez l'application de lancement à l'aide du gestionnaire de packages

pm disable com.Android.launcher2

Maintenant, la touche Accueil reste toujours sur le même écran.

23
amiekuser

Cette solution fonctionne jusqu'à 3.x uniquement.

D'accord, c'était censé être une question difficile. Mais voici un moyen de le casser.

Remplacez la méthode ci-dessous dans votre activité,

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

Et maintenant gérer l'événement clé comme celui-ci,

@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;
}
13
Andro Selva

Ajoutez ce code à votre classe 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();
    }
}

Ce n'est pas un bouton de verrouillage pour 'home', mais l'utilisateur ne peut pas passer à une autre application pendant une longue période (plus de 100 millisecondes), c'est peut-être ce que vous voulez.

8
Stas BZ

Pour désactiver le bouton d'accueil, essayez ceci:

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

Le problème avec la barre de notification abaissée peut être résolu en masquant la barre de notification comme ici:

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

ou définissez le thème plein écran pour votre activité ou application dans le manifeste:

Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
1
Alex