Comment désactiver le bouton Accueil dans Android comme faire les applications lock screen?

je sais que cette question est posée plusieurs fois mais j'ai trouvé qu'aucune de la solution ne fonctionne. J'ai essayé le code donné ci-dessous...

   protected void onPause() {
   super.onPause();
    Intent intent = new Intent(this,LockActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT |Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    }

Ce qu'il fait est qu'il mettre la reprise de l'activité vers l'avant lorsque l'écran d'accueil android est lancé, mais il faut presque 3-4 secondes pour amener de l'activité againt à l'avant de l'écran d'accueil est lancé.

j'ai utilisé quelques applications d'écran de verrouillage qui ne démarrent même pas l'écran d'accueil lorsque le bouton d'accueil est cliqué. Je veux atteindre quelque chose comme ça.

j'ai aussi utilisé la méthode onUserLeavesHint, la méthode onKeyDown et la méthode onKeyDispatch mais aucune d'elles n'a fonctionné pour moi.

Et merci de ne pas répondre ou de commenter comme il n'est pas possible de désactiver le bouton home dans Android. Pour de telles réponses ou commentaires, je vous suggérerais de passer par quelques applications D'écran de verrouillage sur PlayStore. J'ai aussi trouvé une application de travail sur github le long du code source. Il fonctionnait sur mon téléphone et l'application utilisé disableKeyguard mais quand je fais le même dans mon application, cela ne fonctionne pas (disableKeyguard est déprécié mais j'utilise @supress warnings("deprecation")).

16
demandé sur Ruag 2016-04-03 11:45:36

6 réponses

source -https://github.com/shaobin0604/Android-HomeKey-Locker

//Copy this class
public class HomeKeyLocker {
    private OverlayDialog mOverlayDialog;
    public void lock(Activity activity) {
        if (mOverlayDialog == null) {
            mOverlayDialog = new OverlayDialog(activity);
            mOverlayDialog.show();
        }
    }
    public void unlock() {
        if (mOverlayDialog != null) {
            mOverlayDialog.dismiss();
            mOverlayDialog = null;
        }
    }
    private static class OverlayDialog extends AlertDialog {

        public OverlayDialog(Activity activity) {
            super(activity, R.style.OverlayDialog);
            WindowManager.LayoutParams params = getWindow().getAttributes();
            params.type =  WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
            params.dimAmount = 0.0F; // transparent
            params.width = 0;
            params.height = 0;
            params.gravity = Gravity.BOTTOM;
            getWindow().setAttributes(params);
            getWindow().setFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |  WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 0xffffff);
            setOwnerActivity(activity);
            setCancelable(false);
        }

        public final boolean dispatchTouchEvent(MotionEvent motionevent) {
            return true;
        }

        protected final void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            FrameLayout framelayout = new FrameLayout(getContext());
            framelayout.setBackgroundColor(0);
            setContentView(framelayout);
        }
    }
}

//Paste this in your activity
mHomeKeyLocker = new HomeKeyLocker();
mHomeKeyLocker.lock(this);
7
répondu NitinM 2017-12-01 06:53:17

le moyen sûr de fournir une fonctionnalité de lockscreen sans faille et sans racine est de combiner votre idée d'application "casier" avec une application de lanceur.

un simple changement dans le manifeste permettra à votre application de s'enregistrer comme un homescreen/launcher, ce qui donnera votre .apk contrôle total du bouton d'accueil:

<application
    android:launchMode="singleTask"
    android:clearTaskOnLaunch="true"
    android:stateNotNeeded="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="ch.arnab.simplelauncher.HomeScreen"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:excludeFromRecents="true"
        android:screenOrientation="nosensor">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <!-- These 2 intent-filters identify a launcher: -->
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

Tiré de ce tutoriel

Vous aurez alors deux activités, l'une pour votre accueil de l'écran, un pour votre écran de verrouillage.

Vous aurez à détecter lorsque l'écran est éteint/allumé pour afficher l'écran de verrouillage de l'activité:

public class MainActivity extends Activity {

    //Create a receiver for screen-on/screen-off
    BroadcastReceiver mybroadcast = new BroadcastReceiver() {   
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                //Show lock-screen
            }
            else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                //Also show lock-screen, to remove flicker/delay when screen on?
            }

        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));
    }
}

Tiré de cette réponse

FYI: puisque votre "écran de verrouillage" sera toujours considéré comme faisant partie de votre lanceur à ce stade, apps sera en mesure de lancer sur le dessus de votre écran de verrouillage, ce qui est mauvais si: l'Utilisateur a accès au tiroir de notification pour cliquer sur messages / Tweets etc, mais peut aussi être bon pour: pouvoir répondre aux appels entrants sans déverrouiller le téléphone.

D'une façon ou d'une autre, votre activité de l'écran de verrouillage devrait outrepasser onPause, vérifier si l'utilisateur est "authentifié", s'il n'est pas, supposons que l'utilisateur a ouvert quelque chose et devrait revenir à l'écran de verrouillage:

@Override
public void onPause() {
    super.onPause();
    if(password!=storedPassword) {
      //Lockscreen activity shouldn't ever be escaped without the right password!
      //Return to launcher without root!
      Intent homeIntent = new Intent(Intent.ACTION_MAIN);
      homeIntent.addCategory(Intent.CATEGORY_HOME);
      homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(homeIntent);
    }
}

pour une meilleure expérience utilisateur, vous devriez donner à votre utilisateur l'option de permettre à quelques applications de contourner le lockscreen (tel que comme Spotify), vous pouvez inclure cela dans le if déclaration ci-dessus (ex. if(password!=storedPassword||isForegroundAppSpotify)).

en ce qui concerne le chargement des applications sur votre écran d'accueil, vous pouvez vous référer à tutoriels sur Google pour la création de votre propre lanceur d'activité.

combiner lanceur+lock-screen est le moyen le plus facile d'éviter l'accès root. Vous pouvez trouver plus facile d'utiliser root, mais vous limiterez votre base de clients.

Espérons que cette aide!

4
répondu Aaron Gillion 2017-05-23 11:47:13

Vous pouvez utiliser le shaobin0604 bibliothèque pour ce faire. Il va désactiver le bouton arrière aussi. Vous l'activité devrait ressembler à ceci:


public class MainActivity extends Activity {

HomeKeyLocker homeKeyLocker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    homeKeyLocker = new HomeKeyLocker();
    homeKeyLocker.lock(this);
}

}

2
répondu Jordan Junior 2016-04-11 19:20:34

j'ai fait beaucoup de recherches pour la conception de l'écran de verrouillage et enfin trouvé une solution. Android a désactivé la fonctionnalité pour outrepasser les barres du système sauf le bouton back. Mais il y a un petit travail à faire pour que cela fonctionne:

comprendre et mettre en oeuvre écran de l'épinglage patiemment et vous réussirez.

vous pouvez créer une application pour contrôler ce que toutes les applications que vous voulez mettre en œuvre le blocage de l'écran ou vous pouvez mettre en œuvre le blocage de l'écran directement dans le même application que vous voulez épingler.

je vais vous montrer la dernière implémentation dans cet article:

1. Tout d'abord, votre application doit être le propriétaire de l'appareil.

Vous pouvez le faire de plusieurs façons, la plus simple est d'exécuter la commande:

adb shell dpm set-appareil-propriétaire [yourPackageName]/.[MyDeviceAdminReceiver]

créer un récepteur(MyDeviceAdminReceiver) qui étend DeviceAdminReceiver. Vous n'avez pas besoin d'avoir tout le code dans ici. Pour plus d'informations sur la mise en œuvre par le propriétaire de L'appareil, reportez-vous à link

http://florent-dupont.blogspot.com/2015/02/10-things-to-know-about-device-owner.html

Enregistrer le récepteur dans L'AndroidManifest.fichier xml de cette façon :

<receiver
       android:name=".MyDeviceAdminReceiver"
       android:label="@string/app_name"
       android:permission="android.permission.BIND_DEVICE_ADMIN">
     <meta-data
       android:name="android.app.device_admin"
       android:resource="@xml/device_admin" />

       <intent-filter>
         <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
       </intent-filter>
  </receiver>

2. Votre méthode onCreate devrait ressembler à ceci:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lock_screen);

    ComponentName deviceAdmin = new ComponentName(this, MyDeviceAdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);


    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    }

    if (mDpm.isLockTaskPermitted(this.getPackageName()))
        startLockTask();

3.Pour décompresser l'écran et rendre la barre de Navigation fonctionnelle:

appeler le la fonction stopLockTask () à une place dans votre code où vous voulez décrocher. Par exemple, dans mon application, dès que je vérifie que l'Utilisateur a tapé le bon code, j'appelle cette fonction:

 if (userInput.length() == 4) {

                    if (userInput.equals(passcode)) {
                        userInput = "";
                        etxtPasscodeDisplay.setText("");
                        stopLockTask(); // this is what you need
                        unlockHomeButton(); // A method to show home screen when 
                         passcode is correct
                        finishAffinity(); //kill other activities
                    }

plus d'Info ce qui est généralement requis pour les lockscreens:

1. Si votre application est la première chose qui vient après le démarrage:

vous avez besoin d'un service(StartAtBootService) et d'un récepteur (BootCompletedReceiver) pour cela.

2. Si vous voulez que votre application après l'écran de verrouillage et de déverrouillage (le bouton d'alimentation est enfoncé pour verrouiller et déverrouiller):

Créer AEScreenOnOffService qui s'étend service et AEScreenOnOffReceiver that extends BroadcastReceiver pour lancer votre activité lorsque l'écran est activé.

pour une information détaillée sur tout ce que j'ai mentionné ici, référez-vous http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/

C'est une excellente écrire qui m'a beaucoup aidé. Merci à l'auteur.

il me faut au moins 10 reputation pour afficher plus de deux liens. Comme je suis nouveau à stackoverflow Je n'ai pas assez de réputation donc je suis désolé de ne pas être en mesure de partager tous les liens que j'ai mentionnés. Va sûrement mettre à jour le post une fois que j'ai accès.

2
répondu Nithesh 2017-05-11 17:37:07

la réponse Simple à votre question est que vous ne pouvez pas faire cela.

La solution que vous avez mentionner a été suggéré par moi il y a quatre ans [Lien].

onUserLeavesHint, onKeyDown et onKeyDispatch ne "désactiveront" jamais les clés matérielles.

si vous voulez vraiment "manier" le bouton D'accueil, vous devrez faire votre demande comme écran d'accueil. Voir et .

Si vous voulez vraiment désactiver votre clé matérielle sans faire une application Home screen, vous devriez roter votre périphérique et supprimer le fichier périphérique correspondant du module du noyau. (Essayer à vos risques et périls!)

1
répondu PC. 2017-05-23 12:26:06

ce que vous pouvez faire est de surcharger la fonction home key comme ceci:

@Override public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        //The Code Want to Perform.
    }
});

Alors vous devriez être en mesure d'empêcher l'utilisateur de revenir à l'écran d'accueil à l'aide de ce bouton. L'espoir qui fonctionne pour vous.

modifier: Le problème avec la suppression du bouton home est qu'il est considéré comme un trou de sécurité par Google, donc à chaque fois que quelqu'un trouve un moyen de le contourner, Google corrige ce "trou".  

-1
répondu primaël quemerais 2016-04-09 10:46:28