Muszę wyłączyć przycisk Home i inne przyciski systemowe w mojej aplikacji na Androida.
Przykład: MX Player
( patrz w Google Play ) - możesz nacisnąć ikonę "kłódki" na ekranie odtwarzacza i zablokuje ona wszystkie przyciski sprzętowe i systemowe.
Działa dobrze BEZ ROOTOWANIA.
Przetestowałem to na niektórych urządzeniach z różnymi wersjami Androida. Próbowałem zdemontować Kids Lock (wtyczkę), ale nie mam jeszcze pojęcia, jak to działa.
Potrzebuję tego samego rozwiązania, co Kids Lock (wtyczka) do MX Player
: - wyłączania Home, Back i wszystkich innych przycisków systemowych.
Jakieś sugestie?
Odpowiedzi:
Po pierwsze, zastanów się długo i intensywnie, jeśli naprawdę chcesz wyłączyć
Home
przycisk lub jakikolwiek inny przycisk w tej sprawie (np.Back
Przycisk), nie jest to coś, co należy robić (przynajmniej w większości przypadków jest to zły projekt ). Mogę mówić tylko za siebie, ale jeśli pobrałem aplikację, która nie pozwala mi zrobić czegoś takiego jak kliknięcie przycisku systemu operacyjnego, następną rzeczą, jaką robię, jest odinstalowanie tej aplikacji i pozostawienie bardzo złej recenzji. Uważam również, że Twoja aplikacja nie będzie prezentowana w App Store.Teraz...
Zwróć uwagę, że
MX Player
prosi się o pozwolenie na rysowanie na innych aplikacjach:Ponieważ nie możesz zastąpić
Home
przycisku naAndroid
urządzeniu (przynajmniej nie w najnowszych wersjach systemu operacyjnego).MX Player
rysuje się nad programem uruchamiającym po „zablokowaniu” aplikacji i kliknięciuHome
przycisku.Aby zobaczyć przykład tego, który jest nieco prostszy i bardziej zrozumiały, możesz zobaczyć aplikację Facebook Messenger .
Ponieważ poproszono mnie o podanie więcej informacji na temat MX Player
Status Bar
iNavigation Bar
„zastępowania”, edytuję moją odpowiedź, aby uwzględnić również te tematy.Po pierwsze, MX Player korzysta z wciągającego trybu pełnoekranowego ( DevBytes Video )
KitKat
.Android 4.4 (poziom API 19) wprowadza nową flagę SYSTEM_UI_FLAG_IMMERSIVE dla setSystemUiVisibility () , dzięki której Twoja aplikacja może działać naprawdę „na pełnym ekranie”. Ta flaga w połączeniu z flagami SYSTEM_UI_FLAG_HIDE_NAVIGATION i SYSTEM_UI_FLAG_FULLSCREEN ukrywa paski nawigacji i stanu oraz umożliwia aplikacji przechwytywanie wszystkich zdarzeń dotykowych na ekranie.
Gdy włączony jest wciągający tryb pełnoekranowy, wszystkie zdarzenia dotyku są nadal odbierane podczas Twojej aktywności. Użytkownik może odsłonić paski systemowe, przesuwając palcem do wewnątrz w obszarze, w którym zwykle pojawiają się paski systemowe. Spowoduje to wyczyszczenie flagi SYSTEM_UI_FLAG_HIDE_NAVIGATION (i flagi SYSTEM_UI_FLAG_FULLSCREEN , jeśli jest stosowana), dzięki czemu paski systemowe staną się widoczne. Spowoduje to również wyzwolenie twojego View.OnSystemUiVisibilityChangeListener , jeśli jest ustawiony. Jeśli jednak chcesz, aby paski systemowe ponownie się automatycznie ukrywały po kilku chwilach, możesz zamiast tego użyć flagi SYSTEM_UI_FLAG_IMMERSIVE_STICKY . Zwróć uwagę, że „lepka” wersja flagi nie wyzwala żadnych nasłuchujących, ponieważ paski systemowe pokazane tymczasowo w tym trybie są w stanie przejściowym.
Po drugie: ukrycie paska stanu
Po trzecie: ukrycie paska nawigacji
Należy pamiętać, że chociaż korzystanie z wciągającego trybu pełnoekranowego służy tylko do
KitKat
, ukrywanieStatus Bar
iNavigation Bar
nie tylkoKitKat
.Nie mam wiele do powiedzenia na temat drugiego i trzeciego, rozumiesz, wierzę, że w każdym razie jest to szybka lektura. Tylko pamiętaj, aby zwrócić szczególną uwagę na View.OnSystemUiVisibilityChangeListener .
Dodałem streszczenie, które wyjaśnia, o co mi chodzi, nie jest kompletne i wymaga naprawy, ale masz pomysł. https://gist.github.com/Epsiloni/8303531
Powodzenia we wdrażaniu tego i dobrej zabawy!
źródło
TYPE_SYSTEM_ALERT
,SYSTEM_UI_FLAG_HIDE_NAVIGATION
iSYSTEM_UI_FLAG_IMMERSIVE_STICKY
nie ma mowy o wyjściu z aplikacji. Obie listwy systemowe pozostają ukryte. Chyba że menu zasilania jest otwarte. Następnie ponownie pojawia się pasek nawigacji, a przycisk strony głównej staje się funkcjonalny. MX Player udaje się w takim przypadku ukryć pasek nawigacji. Dlatego w przypadku urządzeń z systemem KitKat nadal musimy to naprawić.IMMERSIVE_STICKY
nie działa. Dlatego możliwe jest wyświetlenie paska nawigacji (pasek stanu pozostaje ukryty z powoduSYSTEM_ALERT
). Możemy to wykryć za pomocąOnSystemUiVisibilityChangeListener
i ponownie włączyć flagi. Jednak z jakiegoś powodu działa to dopiero po sekundzie, czyli więcej niż wystarczająco dużo czasu, aby nacisnąć przycisk Home. MX Player nie używaIMMERSIVE STICKY
(paski pojawiają się na KitKacie), ale paski ponownie znikają, zanim się zorientujesz.Poszedłem za odpowiedzią shaobin0604 i ostatecznie udało mi się zablokować przycisk HOME, dodając:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
do
AndroidManifest.xml
Wszystko, co musisz zrobić, to skopiowaćHomeKeyLocker.java
z biblioteki shaobin do swojego projektu i zaimplementować go tak, jak w przykładzie shaobin . BTW: Wersja mojego AVD na Androida to Android 4.0.3 .źródło
Możesz użyć Android-HomeKey-Locker, aby wyłączyć HOME KEY i inne klawisze systemowe (takie jak BACK KEY i MENU KEY)
Mam nadzieję, że to pomoże Ci w aplikacji. Dzięki.
źródło
Możesz wyłączyć przycisk Home i Recents w systemie Android 5.0, korzystając z funkcji przypinania ekranu wymienionej tutaj :
Możesz zablokować urządzenie, aby było kioskiem. Pasek nawigacji nie jest ukryty, ale przyciski Strona główna i Ostatnie można usunąć lub wyłączyć w zależności od sposobu aktywacji trybu. Napisałem trochę informacji po przetestowaniu tej funkcji tutaj .
źródło
Zgaduję, ale myślę, że z uprawnieniem SYSTEM_ALERT_WINDOW (wyświetlanym jako „Rysuj na innych aplikacjach”, patrz tutaj ) byłoby to możliwe: wyświetlaj swoją aplikację jako pełnoekranowe okno typu alertu systemowego . W ten sposób ukryje wszystkie inne aplikacje, nawet ekran główny, więc jeśli naciśniesz przycisk Home, tak naprawdę nie zostanie wyłączony, po prostu bez widocznego efektu.
MX Player ma zadeklarowane to uprawnienie, a Facebook Messenger ma je również do wyświetlania „ czatów ” na czymkolwiek - więc może to być rozwiązanie.
Aktualizacja (dodana z moich komentarzy): Następnie użyj SYSTEM_UI_FLAG_HIDE_NAVIGATION w połączeniu z przechwytywaniem zdarzeń dotykowych / za pomocą OnSystemUiVisibilityChangeListener, aby nadpisać domyślne zachowanie (pasek nawigacyjny pojawia się po dotknięciu). Ponadto, ponieważ powiedziałeś, że immersyjny gest wyjścia nie działa, możesz spróbować ustawić SYSTEM_UI_FLAG_IMMERSIVE_STICKY (z SYSTEM_UI_FLAG_FULLSCREEN i SYSTEM_UI_FLAG_HIDE_NAVIGATION).
źródło
getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- pokazuje, że spowoduje to ukrycie paska stanu (a ruch przesuwania w dół używany do wychodzenia z pełnego ekranu nie działa), ale nie pasek nawigacji. Przyciski na tym pasku nadal działają.Kiedyś można było wyłączyć przycisk Home, ale teraz nie jest. Jest to spowodowane złośliwym oprogramowaniem, które może uwięzić użytkownika.
Więcej szczegółów znajdziesz tutaj: Wyłącz przycisk Home w Androidzie 4.0+
Wreszcie przycisk Wstecz można wyłączyć, jak widać w tym drugim pytaniu: Wyłącz przycisk Wstecz w systemie Android
źródło
Jeśli kierujesz reklamy na Androida 5.0 lub nowszego. Możesz użyć:
Activity.startLockTask()
źródło
Najpierw utwórz metodę:
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); }
Następnie nazywasz to
onCreate()
metodą swojego działania. Wywołaj to ponownie wonResume()
metodzie. Następnie możesz dodać inną metodę do swojej aktywności, taką jak ta:@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); hideNavigationBar(); }
To będzie to. Pamiętaj, że zablokuje ekran do następnego dotknięcia ekranu przez użytkownika, w klasie Timer możesz zmienić opóźnienie i pozwoli ci to zmienić rzeczy dla tej instancji, a następnie ponownie zablokuje ekran.
źródło
Ja też szukałem tego przez jakiś czas i w końcu udało mi się to zrobić tak, jak potrzebowałem, tj. Pasek nawigacji jest niedostępny, pasek stanu jest niedostępny, nawet jeśli długo naciskasz przycisk zasilania, ani menu zasilania, ani przyciski nawigacyjne nie są wyświetlane. Dzięki @Assaf Gamliel jego odpowiedź zaprowadziła mnie na właściwą ścieżkę. Postępowałem zgodnie z tym samouczkiem z niewielkimi modyfikacjami. Podczas określania Typu podałem
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
zamiastWindowManager.LayoutParams.TYPE_PHONE
, w przeciwnym razie nasza „nakładka” nie będzie ukrywać pasków systemowych. Możesz bawić się flagami, wysokością, szerokością itp., Aby zachowywał się tak, jak chcesz.źródło
nie wiem, jak zrobić przycisk Home. tak długo, jak moja wiedza, otrzymałem następujący link.
zapoznaj się z linkiem: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME
Stała kodu klucza: klucz Home. Ten klucz jest obsługiwany przez platformę i nigdy nie jest dostarczany do aplikacji.
Ale możemy diable przycisk Wstecz. mam nadzieję, że poniższy kod ci pomoże.
@Override public void onBackPressed() { //return nothing return; }
źródło
Odświeżam stary temat. Udało mi się osiągnąć, że moja aktywność nie zwija się po naciśnięciu przycisku Home (fizycznego lub wirtualnego). Oto mój kod
onCreate()
metody działania :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);
W przypadku API 26 i wyżej musisz uzyskać od użytkownika uprawnienia do nakładania ekranu. Testowane na Androidzie 7 i 8.
źródło
Nie możesz wyłączyć przycisku Początek w ICS onwords, ale możesz wyłączyć inne przyciski w następujący sposób
@Override public boolean dispatchKeyEvent(KeyEvent keyEvent){ return true; }
źródło
Post ICS, czyli Android 4+, nadpisanie HomeButton zostało usunięte ze względów bezpieczeństwa, aby umożliwić użytkownikowi wyjście w przypadku, gdy aplikacja okaże się złośliwym oprogramowaniem.
Ponadto nie jest dobrym zwyczajem nie pozwalanie użytkownikowi na opuszczenie aplikacji. Ale ponieważ tworzysz aplikację na ekranie blokady, możesz zadeklarować aktywność jako Launcher, aby po naciśnięciu przycisku HomeButton po prostu ponownie uruchomił aplikację i sam tam pozostał (użytkownicy nie zauważyliby nic poza niewielkim migotaniem na ekranie).
Możesz przejść przez następujący link:
http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html
źródło
Szczerze mówiąc, nie można wyłączyć przycisku Home przynajmniej na nowych poziomach API, czyli od 4.0. Nie jest to również wskazane. Możesz jednak zablokować przycisk Wstecz, zastępując
public void onBackPressed() { // do not call super onBackPressed. }
aby nadpisać przycisk home, możesz na przykład użyć timera i po każdym czasie sprawdzić, czy ekran główny jest twoim ekranem, czy też nie, czy twój pakiet jest na górze, czy nie (jestem pewien, że dostaniesz do niego linki ) i wyświetl swoją aktywność za pomocą flagi single_top.
W ten sposób, nawet jeśli zostanie naciśnięty przycisk Home, będziesz mógł przenieść swoją aplikację na górę.
Upewnij się również, że aplikacja ma sposób na wyjście, ponieważ takie aplikacje mogą być naprawdę denerwujące i nigdy nie powinny być tworzone.
Miłego kodowania.
PS: Nie można przechwycić zdarzenia domowego, gdy naciśnięty jest przycisk home.
Możesz używać metod dołączania do okna, a także metod blokady klawiatury, ale nie dla poziomów interfejsu API od 4.0.
źródło
Używanie rotacji powoduje wyjątek, więc naprawiłem swoją aktywność, używając tego:
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); }
Będziesz musiał skorzystać z sugestii @ Lê Quang Duy.
źródło
Pracuję nad aplikacją, która musi blokować tablet tylko dla aplikacji. Najpierw ustawiam aplikację jako MainLauncher, a następnie blokuję pasek zadań za pomocą AndroidView. Wreszcie blokuję tablet. Nie jest to funkcja, którą wskazuję, aby używać w wielu modelach tabletów, ponieważ każdy model urządzenia ma funkcję, która ją blokuje.
Ale ogólnie to działa dla każdego. Możesz użyć poleceń
Java.Lang.Runtime.GetRuntime().Exec("su -c sed -i '/VOLUME_UP/s/^# //g' /system/usr/keylayout/Generic.kl");
jako przykład, aby wyłączyć przyciski. Ale wszystko opiera się na zmianie plików systemowych, w folderze „/ system / usr / keylayout / ...”. UWAGA: Działa tylko na zrootowanych urządzeniach.
Innym sposobem, który próbuję, choć wciąż się rozwijam, jest użycie StreamWrite i StreamReader, aby uzyskać dostęp do RootDirectory i przepisać cały plik, aby wyłączyć i włączyć przyciski.
Mam nadzieję że to pomoże.
Wszelkie pytania pozostają dostępne.
źródło
Dla każdego, kto chce całkowicie usunąć soft-nav na zrootowanym (lub niestandardowym ROM) urządzeniu z Androidem, możesz zmodyfikować plik
build.prop
plik tekstowy w folderze systemowym.Ustaw następującą zmienną / wartość:
gemu.hw.mainkeys=1
To jest to, czego używają sprzedawcy, aby wyłączyć miękką nawigację, gdy mają fizyczne przyciski.
źródło
Przepraszam, że odpowiadam po 2-3 latach. ale możesz ukryć aktywność wszystkich przycisków systemowych. Po prostu sprawdź moje odpowiedzi Jak wyłączyć przycisk wirtualnego domu w dowolnej aktywności? .
źródło