wake-up-neo.net

Deaktivieren der Tasten für Zuhause und andere Systeme in Android

In meiner Android-Anwendung muss ich die Schaltflächen für das Home und andere Systeme deaktivieren.

Beispiel:MX Player ( siehe bei Google Play ) - Sie können das Sperrsymbol auf dem Player-Bildschirm drücken und alle Tasten des Hardware- und Software-Systems werden gesperrt. 

Es funktioniert gut ohne ROOTING. 

Ich habe es auf einigen Geräten mit verschiedenen Android-Versionen getestet. Ich habe versucht, Kids Lock (Plugin) zu demontieren, weiß aber noch nicht, wie es funktioniert.

Ich brauche dieselbe Lösung wie das Kids Lock (Plugin) für MX Player: - deaktivieren Sie Home, Back und alle anderen Systemtasten.

Irgendwelche Vorschläge?

74
user1024

Überlegen Sie sich bitte lange und gründlich, ob Sie wirklich die Home-Schaltfläche oder eine andere Schaltfläche deaktivieren möchten (z. B. die Back-Schaltfläche). Dies sollte nicht der Fall sein (zumindest meistens ist dies eine schlechtes Design). Ich kann nur für mich selbst sprechen, aber wenn ich eine App heruntergeladen habe, die mich nicht dazu veranlasst, einen OS-Knopf zu klicken, deinstalliere ich die App und hinterlasse eine sehr schlechte Bewertung. Ich glaube auch, dass Ihre App nicht im App Store angezeigt wird.

Jetzt...

Beachten Sie, dass MX Player um Erlaubnis bittet, über andere Anwendungen zu zeichnen:MX Player permissions
Da Sie die Home-Schaltfläche auf dem Android-Gerät nicht überschreiben können, ist dies in den neuesten Versionen des Betriebssystems nicht möglich. MX Player zeichnet sich auf Ihrem Launcher auf, wenn Sie die App "sperren", und klickt auf die Schaltfläche Home .
Um ein Beispiel zu sehen, das ein bisschen einfacher und verständlicher ist, können Sie die Facebook Messenger App sehen.

Da ich gebeten wurde, weitere Informationen zu MX Player Status Bar und Navigation Bar "überschreiben" anzugeben, bearbeite ich meine Antwort, um auch diese Themen aufzunehmen.

Als Erstes verwendet MX Player den Immersive Vollbildmodus ( DevBytes Video ) für KitKat.
Android 4.4 (API Level 19) führt ein neues SYSTEM_UI_FLAG_IMMERSIVE Flag für setSystemUiVisibility () ein, mit dem Ihre App wirklich "Vollbild" wird. Wenn dieses Flag mit den Flags SYSTEM_UI_FLAG_HIDE_NAVIGATION und SYSTEM_UI_FLAG_FULLSCREEN kombiniert wird, werden die Navigations- und Statusleisten ausgeblendet, und Ihre App erfasst alle Berührungsereignisse auf dem Bildschirm.

Wenn der immersive Vollbildmodus aktiviert ist, empfängt Ihre Aktivität weiterhin alle Berührungsereignisse. Der Benutzer kann die Systemleisten mit einem nach innen gerichteten Streichen in dem Bereich anzeigen, in dem die Systemleisten normalerweise angezeigt werden. Dies löscht das Flag SYSTEM_UI_FLAG_HIDE_NAVIGATION (und das Flag SYSTEM_UI_FLAG_FULLSCREEN , falls vorhanden), damit die Systembalken sichtbar werden. Dies löst auch Ihren View.OnSystemUiVisibilityChangeListener aus, falls gesetzt. Wenn Sie jedoch möchten, dass die Systemleisten nach wenigen Augenblicken automatisch wieder ausgeblendet werden, können Sie stattdessen das Flag SYSTEM_UI_FLAG_IMMERSIVE_STICKY verwenden. Beachten Sie, dass die "sticky" -Version des Flags keine Listener auslöst, da in diesem Modus temporär angezeigte Systemleisten in einem Übergangszustand sind. 

Zweitens: Statusleiste ausblenden
Drittens: Ausblenden der Navigationsleiste
Bitte beachten Sie, dass die Verwendung des immersiven Vollbildschirms nur für KitKat gilt. Das Ausblenden von Status Bar und Navigation Bar gilt jedoch nicht nur für KitKat.

Ich habe nicht viel zu dem zweiten und dritten zu sagen. Sie haben die Idee, ich glaube, es ist auf jeden Fall eine schnelle Lektüre. Stellen Sie nur sicher, dass Sie genau auf View.OnSystemUiVisibilityChangeListener achten.

Ich habe eine Gist hinzugefügt, die erklärt, was ich meinte, es ist nicht vollständig und muss korrigiert werden, aber Sie bekommen die Idee. https://Gist.github.com/Epsiloni/8303531

Viel Glück bei der Umsetzung und viel Spaß!

86
Assaf Gamliel

Ich folgte der Antwort von shaobin0604 und es gelang mir schließlich, den HOME-Button zu sperren, indem er Folgendes hinzufügte:

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />

zu AndroidManifest.xml Alles, was Sie tun müssen, ist, HomeKeyLocker.Java von shaobins lib in Ihr Projekt zu kopieren und wie in shaobins Beispiel zu implementieren. Übrigens: Meine Android-Version von AVD ist Android 4.0.3.

12
Lê Quang Duy

Sie können Android-HomeKey-Locker verwenden, um die HOME-TASTE und andere Systemtasten (z. B. BACK-TASTE und MENÜ-TASTE) zu deaktivieren.

Ich hoffe, das hilft Ihnen bei Ihrer Bewerbung. Vielen Dank.

11
shaobin0604

Sie können die Start und Zurück-Taste Android 5.0 deaktivieren, indem Sie die Bildschirmanheftungsfunktion hier verwenden:

Android 5.0 führt eine neue Screen-Pinning-API ein, mit der Sie Benutzer vorübergehend daran hindern, Ihre Aufgabe zu verlassen oder unterbrochen zu werden durch Benachrichtigungen. Dies kann beispielsweise verwendet werden, wenn Sie .__ sind. Entwicklung einer Bildungs-App zur Unterstützung der Bewertung von hohen Einsätzen Anforderungen für Android oder eine Einzelanwendung oder Kiosk-Anwendung . Sobald Ihre App das Screenpinning aktiviert hat, können Benutzer nicht angezeigt werden Benachrichtigungen, Zugriff auf andere Apps oder Rückkehr zum Startbildschirm, bis Ihre App beendet den Modus.

Sie können das Gerät als Kiosk sperren. Die Navigationsleiste ist nicht ausgeblendet, aber die Schaltflächen "Start" und "Zurück" können je nach Aktivierung des Modus entweder entfernt oder deaktiviert werden. Ich habe einige Informationen geschrieben, nachdem ich diese Funktion hier getestet hatte.

10
tagy22

Nur eine Vermutung, aber ich denke, mit der Berechtigung SYSTEM_ALERT_WINDOW (angezeigt als "Über andere Apps zeichnen", siehe hier ) könnte es möglich sein: Anzeige Ihrer App als Vollbild, Systemalarmtyp Fenster. Auf diese Weise werden alle anderen Apps, auch der Startbildschirm, ausgeblendet. Wenn Sie also Home drücken, wird wirklich nur ohne sichtbaren Effekt deaktiviert.

MX Player hat diese Berechtigung erklärt, und Facebook Messenger hat auch die Möglichkeit, " chat heads " über irgendetwas anzuzeigen - es könnte also die Lösung sein.

Update (hinzugefügt aus meinen Kommentaren): Verwenden Sie anschließend SYSTEM_UI_FLAG_HIDE_NAVIGATION in Verbindung mit dem Erfassen von Berührungsereignissen/mit OnSystemUiVisibilityChangeListener, um das Standardverhalten zu überschreiben. Da Sie sagten, dass die immersive Exit-Geste nicht funktioniert, können Sie auch versuchen, SYSTEM_UI_FLAG_IMMERSIVE_STICKY (mit SYSTEM_UI_FLAG_FULLSCREEN und SYSTEM_UI_FLAG_HIDE_NAVIGATION) einzustellen.

6
molnarm

Früher war es möglich, die Home-Taste zu deaktivieren, jetzt aber nicht mehr. Dies liegt an bösartiger Software, die den Benutzer blockieren könnte.

Sie können weitere Details hier sehen: Deaktivieren Sie die Home-Taste in Android 4.0+

Schließlich kann die Zurück-Schaltfläche deaktiviert werden, wie Sie in dieser anderen Frage sehen können: Zurück-Schaltfläche in Android deaktivieren

4

Auch ich habe dies irgendwann gesucht und konnte es schließlich nach Belieben tun, dh die Navigationsleiste ist nicht zugänglich, die Statusleiste ist nicht zugänglich, auch wenn Sie lange auf die Ein/Aus-Taste drücken. Dank @Assaf Gamliel brachte mich seine Antwort auf den richtigen Weg. Ich habe diesem Tutorial mit einigen geringfügigen Änderungen gefolgt. Bei der Angabe von Type habe ich WindowManager.LayoutParams.TYPE_SYSTEM_ERROR anstelle von WindowManager.LayoutParams.TYPE_PHONE angegeben. Andernfalls werden die Systemleisten durch unser "Overlay" nicht ausgeblendet. Sie können mit den Flags, der Höhe, der Breite usw. herumspielen, damit es sich so verhält, wie Sie es möchten.

2
aravindsagar

Erstellen Sie zuerst eine Methode:

public void hideNavigationBar() {
        final View decorView = this.getWindow().getDecorView();
        final int uiOptions =
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                YourActivityName.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        decorView.setSystemUiVisibility(uiOptions);

                    }
                });
            }
        };

        timer.scheduleAtFixedRate(task, 1, 2);

    }

Dann rufen Sie es mit der onCreate()-Methode Ihrer Aktivität auf . Rufen Sie es erneut mit der onResume()-Methode ..__ auf. Dann können Sie eine weitere Methode in Ihre Aktivität einfügen:

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        hideNavigationBar();
    }

Das wird es ... sein. Denken Sie daran, dass der Bildschirm so lange gesperrt wird, bis der Benutzer das nächste Mal den Bildschirm berührt. In der Timer-Klasse können Sie die Verzögerung ändern, sodass Sie die Einstellungen für diese Instanz ändern können. Anschließend wird der Bildschirm wieder gesperrt .

2

Wenn Sie Android 5.0 oder höher als Ziel festlegen. Du könntest benutzen:

Activity.startLockTask()
2
lowolfne

ich weiß nicht, wie man den Home-Button diabelen kann ... solange ich weiß, habe ich folgenden Link.

siehe den Link: - http://developer.Android.com/reference/Android/view/KeyEvent.html#KEYCODE_HOME

Tastenkonstante: Home-Taste. Dieser Schlüssel wird vom Framework gehandhabt und wird niemals an Anwendungen ausgeliefert.

Aber wir können die Schaltfläche "Zurück" rückgängig machen. Der folgende Code hilft Ihnen dabei.

@Override
public void onBackPressed() {
    //return nothing 
    return;
}
1
Harshal Benake

Sie können die Home-Taste nicht mit ICS onwords deaktivieren, Sie können jedoch andere Tasten wie folgt deaktivieren

@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent){
   return true;
}
0
CR Sardar

Für alle, dievollständig auf einem gerooteten (oder benutzerdefinierten ROM)Android-Gerät entfernen möchten, können Sie die build.prop-Textdatei im Systemordner ändern.

Stellen Sie die folgende Variable/den folgenden Wert ein:

gemu.hw.mainkeys=1

Dies ist, was Hersteller verwenden, um die Soft-Navigation zu deaktivieren, wenn sie über physische Tasten verfügen.

0
Le-roy Staines

Ein altes Thema auffrischen ... Ich konnte erreichen, dass meine Aktivität beim Drücken der Home-Taste (physisch oder virtuell) nicht klappt. Hier ist mein Code für die Aktivität onCreate() Methode:

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_screen);
        context = getApplicationContext();
        int windowType;
        if (Build.VERSION.SDK_INT>=26) windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        else windowType = WindowManager.LayoutParams.TYPE_TOAST;
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                windowType,
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_FULLSCREEN,
                PixelFormat.TRANSLUCENT
        );
        wm = (WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);

        mTopView = (ViewGroup) getLayoutInflater().inflate(R.layout.activity_alarm_screen, null);
        getWindow().setAttributes(params);
        //Set up your views here
        testView = mTopView.findViewById(R.id.test);
        wm.addView(mTopView, params);

Für API 26 und darüber benötigen Sie eine Bildschirm-Overlay-Berechtigung vom Benutzer. Getestet auf Android 7 und 8.

0
Dmitri Borohhov

Ich arbeite an einer Anwendung, die das Tablet nur für die Anwendung sperren muss . Zuerst stelle ich meine App als MainLauncher ein, dann sperre ich die Taskleiste mit einem AndroidView . Schließlich blockiere ich das Tablet Dies ist keine Funktion, die ich für mehrere Tablet-Modelle verwenden möchte, da jedes Gerätemodell über eine Funktion zum Blockieren verfügt.

Aber im Allgemeinen funktioniert es für alle ... Sie können die Befehle verwenden 

Java.Lang.Runtime.GetRuntime().Exec("su -c sed -i '/VOLUME_UP/s/^# //g' /system/usr/keylayout/Generic.kl");

als Beispiel, um die Tasten zu deaktivieren. Alles basiert jedoch auf dem Ändern der Systemdateien im Ordner "/ system/usr/keylayout/..." . HINWEIS: Funktioniert nur bei gerooteten Geräten.

Eine andere Möglichkeit, die ich noch weiterentwickle, ist die Verwendung von StreamWrite und StreamReader, um auf das RootDirectory zuzugreifen und die gesamte Datei neu zu schreiben, um die Schaltflächen zu deaktivieren und zu aktivieren.

Hoffe das hilft.

Und Fragen bleiben verfügbar.

Die Verwendung der Rotation verursacht eine Ausnahme. Ich habe meine Aktivität folgendermaßen korrigiert:

HomeKeyLocker locker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_splash);

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

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    locker.unlock();
}

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);
    locker.lock(this);
}

Sie müssen den @ Lê Quang Duy-Vorschlag verwenden.

0
Oscar Romero

Ehrlich gesagt ist es nicht möglich, den Home-Button mindestens auf neuen API-Ebenen, dh ab 4.0, zu deaktivieren. Es ist auch nicht ratsam, dies zu tun. Sie können die Zurück-Schaltfläche jedoch blockieren, indem Sie die 

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

um die Home-Taste außer Kraft zu setzen, können Sie beispielsweise einen Timer verwenden und nach jedem Mal überprüfen, ob der Hauptbildschirm Ihr Bildschirm ist oder nicht, oder ob Ihr Paket oben ist oder nicht (ich bin sicher, dass Sie Links dazu bekommen werden ) und zeigen Sie Ihre Aktivität mit dem Flag single_top an. 

Auf diese Weise können Sie Ihre App auch nach Drücken der Home-Taste nach oben bringen. 

Stellen Sie außerdem sicher, dass die App über eine Möglichkeit zum Beenden verfügt, da solche Apps ärgerlich sein können und niemals entwickelt werden sollten.

Glückliche Kodierung.

P.S: Es ist nicht möglich, das Home-Ereignis abzufangen, wenn die Home-Taste gedrückt wird.

Sie können On-to-Window-Methoden und auch Keyguard-Methoden verwenden, nicht jedoch für API-Ebenen ab 4.0.

Nach ICS, d. H. Android 4+, wurde das Überschreiben des HomeButton aus Sicherheitsgründen entfernt, um den Benutzer zu beenden, falls sich die Anwendung als Malware erweist.

Außerdem ist es keine gute Praxis, den Benutzer nicht von der Anwendung weg navigieren zu lassen. Da Sie jedoch eine Sperrbildschirmanwendung erstellen, können Sie die Aktivität als Launcher deklarieren. Wenn Sie also auf den HomeButton drücken, wird die Anwendung einfach neu gestartet und bleibt dort (die Benutzer würden nur ein leichtes Flimmern feststellen auf dem Bildschirm).

Sie können den folgenden Link durchgehen:

http://dharmendra4Android.blogspot.in/2012/05/override-home-button-in-Android.html

0