Ich muss die Home- und andere Systemschaltflächen in meiner Android-Anwendung deaktivieren.
Beispiel: MX Player
( siehe bei Google Play ) - Sie können das "Sperren" -Symbol auf dem Player-Bildschirm drücken und alle Hardware- und Software-Systemtasten sperren.
Es funktioniert gut ohne Wurzeln.
Ich habe es auf einigen Geräten mit verschiedenen Android-Versionen getestet. Ich habe versucht, Kids Lock (Plugin) zu zerlegen, habe aber noch keine Ahnung, wie es funktioniert.
Ich benötige dieselbe Lösung wie das Kids Lock (Plugin) für MX Player
: - Deaktivieren von Home, Back und allen anderen Systemtasten.
Irgendwelche Vorschläge?
Antworten:
Denken Sie zunächst bitte lange und gründlich darüber nach, ob Sie die
Home
Schaltfläche oder eine andere Schaltfläche (z. B. dieBack
Schaltfläche) wirklich deaktivieren möchten. Dies sollte nicht getan werden (zumindest in den meisten Fällen ist dies ein schlechtes Design ). Ich kann nur für mich selbst sprechen, aber wenn ich eine App heruntergeladen habe, mit der ich nicht auf eine Betriebssystemschaltfläche klicken kann, deinstalliere ich diese App als Nächstes und hinterlasse eine sehr schlechte Bewertung. Ich glaube auch, dass Ihre App nicht im App Store angeboten wird.Jetzt...
Beachten Sie, dass Sie
MX Player
um die Erlaubnis gebeten werden, über andere Anwendungen zu zeichnen:Da Sie die
Home
Schaltfläche auf demAndroid
Gerät nicht überschreiben können (zumindest nicht in den neuesten Betriebssystemversionen).MX Player
Zeichnet sich auf Ihren Launcher, wenn Sie die App "sperren" und auf dieHome
Schaltfläche klicken .Um ein Beispiel dafür zu sehen, das etwas einfacher und einfacher zu verstehen ist, können Sie die Facebook Messenger App sehen .
Da ich gebeten wurde, weitere Informationen zu MX Player
Status Bar
undNavigation Bar
"Überschreiben" bereitzustellen , bearbeite ich meine Antwort, um auch diese Themen aufzunehmen.Als erstes verwendet MX Player den immersiven Vollbildmodus ( DevBytes Video )
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. Dieses Flag verbirgt in Kombination mit den Flags SYSTEM_UI_FLAG_HIDE_NAVIGATION und SYSTEM_UI_FLAG_FULLSCREEN die Navigations- und Statusleisten und lässt Ihre App alle Berührungsereignisse auf dem Bildschirm erfassen.
Wenn der immersive Vollbildmodus aktiviert ist, empfängt Ihre Aktivität weiterhin alle Berührungsereignisse. Der Benutzer kann die Systemleisten mit einem Wisch nach innen entlang des Bereichs anzeigen, in dem die Systemleisten normalerweise angezeigt werden. Dadurch wird das Flag SYSTEM_UI_FLAG_HIDE_NAVIGATION (und das Flag SYSTEM_UI_FLAG_FULLSCREEN , falls angewendet) gelöscht , sodass die Systemleisten sichtbar werden. Dies löst auch Ihren View.OnSystemUiVisibilityChangeListener aus , falls festgelegt. Wenn Sie jedoch möchten, dass die Systemleisten nach einigen 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 sich die in diesem Modus vorübergehend angezeigten Systemleisten in einem vorübergehenden Zustand befinden.
Zweitens: Ausblenden der Statusleiste
Drittens: Ausblenden der Navigationsleiste
Bitte beachten Sie, dass die Verwendung des immersiven Vollbilds nur für
KitKat
, das Ausblenden derStatus Bar
undNavigation Bar
nicht nur fürKitKat
.Ich habe nicht viel zu sagen über die 2. und 3. Sie haben die Idee, ich glaube, es ist auf jeden Fall eine schnelle Lektüre. Achten Sie einfach genau auf View.OnSystemUiVisibilityChangeListener .
Ich habe eine Übersicht hinzugefügt, die erklärt, was ich meinte. Sie ist nicht vollständig und muss repariert werden, aber Sie werden auf die Idee kommen. https://gist.github.com/Epsiloni/8303531
Viel Glück bei der Umsetzung und viel Spaß!
quelle
TYPE_SYSTEM_ALERT
,SYSTEM_UI_FLAG_HIDE_NAVIGATION
undSYSTEM_UI_FLAG_IMMERSIVE_STICKY
gibt es keine Möglichkeit , die App von verlassen. Beide Systemleisten bleiben ausgeblendet. Es sei denn, das Power-Menü ist geöffnet. Dann erscheint die Navigationsleiste erneut und die Home-Taste wird funktionsfähig. MX Player schafft es in diesem Fall, die Navigationsleiste ausgeblendet zu halten. Für Geräte, auf denen KitKat ausgeführt wird, müssen wir dies noch beheben.IMMERSIVE_STICKY
funktioniert das nicht. Daher ist es möglich, die Navigationsleiste anzuzeigen (Statusleiste bleibt wegen ausgeblendetSYSTEM_ALERT
). Wir können dies mit dem erkennenOnSystemUiVisibilityChangeListener
und die Flags wieder aktivieren. Aus irgendeinem Grund funktioniert dies jedoch erst nach etwa einer Sekunde. Dies ist mehr als genug Zeit, um die Home-Taste zu drücken. MX Player wird nicht verwendetIMMERSIVE STICKY
(Balken erscheinen auf Kitkat), aber die Balken verschwinden wieder, bevor Sie es wissen.Ich folgte der Antwort von shaobin0604 und schaffte es schließlich, die HOME-Taste zu sperren, indem ich hinzufügte:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
um
AndroidManifest.xml
Alles , was Sie tun müssen, ist kopierenHomeKeyLocker.java
von Shaobins lib zu Ihrem Projekt und es wie in implementieren Shaobins Vorbild . Übrigens: Die Android-Version meiner AVD ist Android 4.0.3 .quelle
Sie können Android-HomeKey-Locker verwenden , um HOME KEY und andere Systemschlüssel (wie BACK KEY und MENU KEY) zu deaktivieren.
Ich hoffe, dies hilft Ihnen bei Ihrer Bewerbung. Vielen Dank.
quelle
Sie können die Home- und Recents-Schaltfläche Android 5.0 mithilfe der hier genannten Funktion zum Fixieren des Bildschirms deaktivieren :
Sie können das Gerät als Kiosk sperren. Die Navigationsleiste ist nicht ausgeblendet, aber die Schaltflächen "Startseite" und "Letzte" können entweder entfernt oder deaktiviert werden, je nachdem, wie Sie den Modus aktivieren. Ich habe einige Informationen geschrieben, nachdem ich diese Funktion hier getestet habe .
quelle
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: Zeigen Sie Ihre App als Vollbildfenster für Systemwarnungen an . Auf diese Weise werden alle anderen Apps, auch der Startbildschirm, ausgeblendet. Wenn Sie also auf Start drücken, wird es nicht wirklich deaktiviert, nur ohne sichtbaren Effekt.
MX Player hat diese Berechtigung deklariert, und Facebook Messenger hat sie auch, um " Chat-Köpfe " über irgendetwas anzuzeigen - also könnte es die Lösung sein.
Update (aus meinen Kommentaren hinzugefügt): Verwenden Sie als Nächstes SYSTEM_UI_FLAG_HIDE_NAVIGATION in Verbindung mit der Erfassung von Berührungsereignissen / verwenden Sie OnSystemUiVisibilityChangeListener, um das Standardverhalten zu überschreiben (Navigationsleiste wird bei Berührung angezeigt). Da Sie sagten, dass die immersive Geste zum Beenden nicht funktioniert, können Sie auch versuchen, SYSTEM_UI_FLAG_IMMERSIVE_STICKY festzulegen (mit SYSTEM_UI_FLAG_FULLSCREEN und SYSTEM_UI_FLAG_HIDE_NAVIGATION).
quelle
getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- zeigt, dass dadurch die Statusleiste ausgeblendet wird (und die Wischbewegung nach unten, mit der der immersive Vollbildmodus beendet wird, nicht funktioniert), nicht jedoch die Navigationsleiste. Die Schaltflächen in dieser Leiste sind weiterhin funktionsfähig.Früher war es möglich, die Home-Taste zu deaktivieren, jetzt ist dies nicht mehr der Fall. Es liegt an bösartiger Software, die den Benutzer fangen würde.
Weitere Details finden Sie hier: Deaktivieren Sie die Home-Schaltfläche in Android 4.0+
Schließlich kann die Schaltfläche Zurück deaktiviert werden, wie Sie in dieser anderen Frage sehen können: Deaktivieren Sie die Schaltfläche Zurück in Android
quelle
Wenn Sie auf Android 5.0 und höher abzielen. Du könntest benutzen:
Activity.startLockTask()
quelle
Erstellen Sie zunächst 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 auf
onCreate()
Methode Ihrer Aktivität. Rufen Sie es bei deronResume()
Methode erneut auf . Dann können Sie Ihrer Aktivität eine weitere Methode wie die folgende hinzufügen:@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); hideNavigationBar(); }
Das wird es sein. Denken Sie daran, dass der Bildschirm gesperrt wird, bis der Benutzer das nächste Mal den Bildschirm berührt. In der Timer-Klasse können Sie die Verzögerung ändern und die Änderungen für diese Instanz vornehmen. Anschließend wird der Bildschirm erneut gesperrt.
quelle
Auch ich habe einige Zeit danach gesucht und konnte es schließlich nach Bedarf tun, dh die Navigationsleiste ist nicht zugänglich, die Statusleiste ist nicht zugänglich, selbst wenn Sie die Ein- / Aus-Taste lange drücken, werden weder das Ein / Aus-Menü noch die Navigationstasten angezeigt. Dank @Assaf Gamliel brachte mich seine Antwort auf den richtigen Weg. Ich folgte diesem Tutorial mit einigen geringfügigen Änderungen. Während Typ Angabe angegeben ich
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
stattWindowManager.LayoutParams.TYPE_PHONE
, sonst unser „Overlay“ wird die Systemleisten nicht verbergen. Sie können mit den Flaggen, der Höhe, der Breite usw. herumspielen, damit sie sich so verhalten, wie Sie es möchten.quelle
Ich weiß nicht, wie man die Home-Taste deaktiviert. Solange ich weiß, habe ich folgenden Link.
Verweisen Sie auf den Link: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME
Schlüsselcodekonstante: Home-Taste. Dieser Schlüssel wird vom Framework verwaltet und niemals an Anwendungen geliefert.
Aber wir können den Zurück-Knopf deaktivieren. Ich hoffe, der folgende Code hilft Ihnen dabei.
@Override public void onBackPressed() { //return nothing return; }
quelle
Ein altes Thema aktualisieren. Ich konnte erreichen, dass meine Aktivität nicht klappt, wenn die Home-Taste (physisch oder virtuell) gedrückt wird. Hier ist mein Code für die Aktivitätsmethode
onCreate()
: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);
Unter API 26 und höher müssen Sie vom Benutzer die Berechtigung zur Bildschirmüberlagerung erhalten. Getestet auf Android 7 und 8.
quelle
Sie können die Home-Schaltfläche in ICS-Onwords nicht deaktivieren, andere Schaltflächen jedoch wie folgt deaktivieren
@Override public boolean dispatchKeyEvent(KeyEvent keyEvent){ return true; }
quelle
Nach ICS, dh Android 4+, wurde das Überschreiben des HomeButton aus Sicherheitsgründen entfernt, um den Benutzerexit zu ermöglichen, falls sich herausstellt, dass es sich bei der Anwendung um eine Malware handelt.
Außerdem ist es keine gute Vorgehensweise, den Benutzer nicht von der Anwendung weg navigieren zu lassen. Da Sie jedoch eine Sperrbildschirmanwendung erstellen, können Sie die Aktivität als Starter deklarieren, sodass beim Drücken der HomeButton-Taste Ihre Anwendung einfach neu gestartet wird und dort selbst verbleibt (die Benutzer würden nur ein leichtes Flackern bemerken auf dem Bildschirm).
Sie können über den folgenden Link gehen:
http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html
quelle
Ehrlich gesagt ist es nicht möglich, die Home-Taste zumindest in neuen API-Levels, 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 überschreiben
public void onBackPressed() { // do not call super onBackPressed. }
Um die Home-Schaltfläche zu überschreiben, 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, Sie erhalten Links dazu ) und zeigen Sie Ihre Aktivität mit dem Flag single_top an.
Auf diese Weise können Sie Ihre App auch dann nach oben bringen, wenn Sie die Home-Taste drücken.
Stellen Sie außerdem sicher, dass die App beendet werden kann, da solche Apps wirklich ärgerlich sein können und niemals entwickelt werden sollten.
Viel Spaß beim Codieren.
PS: Es ist nicht möglich, das Home-Ereignis abzufangen, wenn die Home-Taste gedrückt wird.
Sie können On-Attach-to-Window-Methoden und auch Keyguard-Methoden verwenden, jedoch nicht für API-Levels ab 4.0.
quelle
Die Verwendung von Rotation verursacht eine Ausnahme. Daher habe ich meine Aktivität folgendermaßen behoben:
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.
quelle
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. Es 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 insgesamt 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 zum Deaktivieren der Schaltflächen. Aber alles basiert auf dem Ändern der Systemdateien im Ordner "/ system / usr / keylayout / ...". HINWEIS: Funktioniert nur auf gerooteten Geräten.
Eine andere Möglichkeit, die ich versuche, obwohl ich sie noch entwickle, besteht darin, StreamWrite und StreamReader zu verwenden, 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 alle Fragen bleiben verfügbar.
quelle
Für alle, die das Soft-Nav auf einem gerooteten (oder benutzerdefinierten ROM) Android-Gerät vollständig 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 Anbieter verwenden, um die Soft-Navigation zu deaktivieren, wenn sie über physische Tasten verfügen.
quelle
Entschuldigung für die Antwort nach 2-3 Jahren. Sie können jedoch die Aktivität aller Systemschaltflächen ausblenden. Überprüfen Sie einfach meine Antworten Wie deaktiviere ich die virtuelle Home-Schaltfläche in einer Aktivität? .
quelle