Як вимкнути кнопки Home та інші системні кнопки в Android?


80

Мені потрібно вимкнути кнопки Home та інші системні кнопки в моїй програмі Android.

Приклад: MX Player ( див. У Google Play ) - ви можете натиснути піктограму "замок" на екрані програвача, і вона блокує всі апаратні та програмні системні кнопки.

Це чудово працює БЕЗ УКОНЕННЯ.

Я тестував його на деяких пристроях з різними версіями Android. Я намагався розібрати Kids Lock (плагін), але поки не знаю, як це працює.

Мені потрібне таке саме рішення, як Kids Lock (плагін) для MX Player: - вимкнення головного, заднього та всіх інших системних кнопок.

Будь-які пропозиції?


1
stackoverflow.com/questions/17183905/… . Ви не можете вимкнути кнопку "Домашня сторінка".
Рагхундан

2
@ user1024 Ви знайшли якесь рішення для свого питання? Оскільки я також хочу робити таку ж функціональність, як у MX Player.
Chirag Shah

2
Спосіб MX Player досить цікавий. Вони фактично пригнічують панель навігації від повернення.
nhaarman

Ви коли-небудь знаходили рішення цього питання? Мені також потрібно з’ясувати, як вимкнути ці кнопки. Як мінімум, як я можу керувати кнопкою багатозадачності.
портфоліо

Ви можете перевірити мою відповідь, я думаю, допоможе вам досягти того, що ви хочете stackoverflow.com/a/28603790/3300883
Мігель

Відповіді:


91

По-перше, подумайте довго, якщо ви дійсно хочете відключити Homeкнопку або будь-яку іншу кнопку (наприклад, Backкнопку), це не те, що потрібно робити (принаймні більшість випадків це поганий дизайн ). Я можу говорити лише за себе, але якщо я завантажив програму, яка не дозволяє мені робити щось на зразок натискання кнопки ОС, наступне, що я роблю - це видалити цю програму і залишити дуже поганий відгук. Я також вважаю, що ваш додаток не буде розміщений в App Store.

Зараз ...

Зверніть увагу, що MX Playerзапитується дозвіл малювати поверх інших програм: Дозволи програвача MX
Оскільки ви не можете замінити Homeкнопку на Androidпристрої (принаймні ні в останніх версіях ОС). MX Playerмалює себе на панелі запуску, коли ви "блокуєте" програму та натискаєте Homeкнопку.
Щоб побачити приклад, який трохи простіший і зрозуміліший, ви можете побачити додаток Facebook Messenger .

Оскільки мене попросили надати трохи більше інформації про програвач MX Status Barта Navigation Bar"заміщення", я редагую свою відповідь, щоб включити ці теми теж.

Перш за все, MX Player використовує іммерсивний повноекранний режим ( DevBytes Video ) KitKat.
Android 4.4 (API Level 19) представляє новий прапор SYSTEM_UI_FLAG_IMMERSIVE для setSystemUiVisibility (), який дозволяє вашій програмі справді переходити на "весь екран". Цей прапор у поєднанні з прапорами SYSTEM_UI_FLAG_HIDE_NAVIGATION та SYSTEM_UI_FLAG_FULLSCREEN приховує панелі навігації та стану та дозволяє додатку фіксувати всі події дотику на екрані.

Коли ввімкнено повноекранний повноекранний режим, ваша активність продовжує отримувати всі події дотику. Користувач може розкрити системні панелі, провевши всередину вздовж області, де зазвичай відображаються системні панелі. Це очищає прапор SYSTEM_UI_FLAG_HIDE_NAVIGATION (і прапор SYSTEM_UI_FLAG_FULLSCREEN , якщо застосовується), тому системні рядки стають видимими. Це також запускає ваш View.OnSystemUiVisibilityChangeListener , якщо встановлений. Однак якщо ви хочете, щоб системні панелі автоматично автоматично приховувались через кілька хвилин, ви можете замість цього використовувати прапор SYSTEM_UI_FLAG_IMMERSIVE_STICKY . Зверніть увагу, що "липка" версія прапора не викликає жодного слухача, оскільки системні панелі, тимчасово показані в цьому режимі, перехідні.

По-друге: приховування рядка стану
По-третє: приховування панелі навігації
Зверніть увагу, що хоча використання повного повного екрану є лише для KitKat, приховування Status Barта Navigation Barне лише для KitKat.

Я не маю багато що сказати про 2-е та 3-е. Ви розумієте, я вважаю, це швидке читання в будь-якому випадку. Просто не забудьте приділити пильну увагу View.OnSystemUiVisibilityChangeListener .

Я додав зміст, який пояснює, що я мав на увазі, він не повний і потребує певного виправлення, але ви зрозумієте ідею. https://gist.github.com/Epsiloni/8303531

Удачі вам у реалізації цього і отримуйте задоволення!


1
То як він приховує панель навігації та запобігає її повторному появі при торканні екрана? І коли ви робите рух, щоб вийти з режиму занурення, панель навігації негайно знову відображається та ховається. Крім того, неможливо витягнути панель сповіщень, якщо вона заблокована, навіть коли `` занурення '' змушує відображати рядок стану. Як це робиться?
nhaarman

2
Гаразд, це дуже допомагає, але ми ще не зовсім там. Я розміщу два коментарі, один для KitKat, один для Jelly Bean. Для KitKat, використовуючи прапори TYPE_SYSTEM_ALERT, SYSTEM_UI_FLAG_HIDE_NAVIGATIONі SYSTEM_UI_FLAG_IMMERSIVE_STICKY, немає можливості вийти з програми. Обидві системні панелі залишаються прихованими. Якщо не відкрито меню живлення. Потім навігаційна панель знову з’являється, коли кнопка додому стає функціональною. MX Player вдається зберегти навігаційну панель прихованою в такому випадку. Отже, для пристроїв, на яких запущений KitKat, нам все одно потрібно це виправити.
nhaarman

1
Для Jelly Bean (16+) IMMERSIVE_STICKYне працює. Таким чином, можна показати панель навігації (панель стану залишається прихованою через SYSTEM_ALERT). Ми можемо виявити це за допомогою OnSystemUiVisibilityChangeListenerі знову ввімкнути прапори. Однак з якихось причин це працює лише через секунду або близько того, що є більш ніж достатнім часом для натискання кнопки додому. MX Player не використовує IMMERSIVE STICKY(смуги з’являються на kitkat), але смуги знову зникають, перш ніж ви це знаєте.
nhaarman

1
Github Gist для KitKat: gist.github.com/nhaarman/8291022 . Github Gist для Jelly Bean: gist.github.com/nhaarman/8291070 .
nhaarman

7
FYI Assaf, деякі програми ПОТРІБНО заблокувати. Наприклад, програми типу кіоску, де власник дозволяє тимчасовий доступ до апаратного забезпечення. Зараз я створюю додаток для фотобудок, і я не хочу, щоб користувач (людина, яка робить їх фотографування) міг робити що-небудь, крім того, щоб сфотографувати (і кілька інших речей). Власник може розблокувати за допомогою кнопки програмного забезпечення, але в іншому випадку його потрібно вимкнути. Вибачте, але ваша "материнська порада" на початку вашої відповіді потерла мене (і я впевнений, що інші, включаючи ОП) неправильно. Дякую за вашу відповідь, я розгляну її.
ntgCleaner

13

Я прослідкував за відповіддю shaobin0604 і нарешті мені вдалося заблокувати кнопку HOME, додавши:

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

to AndroidManifest.xmlВсе, що вам потрібно зробити, це скопіювати HomeKeyLocker.javaз бібліотеки shaobin у свій проект і реалізувати його, як у прикладі shaobin . До речі: версія мого AVD для Android - це Android 4.0.3 .


Чи працює це в Android 4.4.4? Тому що, він спробував це в моєму Moto G, який працює в 4.4.4. У мене це не спрацювало.
venkat

1
Ця бібліотека просто вимикає жорстку кнопку додому. У Moto G є м'яка кнопка додому, тому вона не працює .. @ venkat
Harry Sharma

Попередження - це гарне рішення, якщо не найкраще, але майте на увазі, що на деяких пристроях (Nexus 4, тобто.) Це не спрацює, і кнопка додому все ще використовується!
JacksOnF1re

12

Ви можете використовувати Android-HomeKey-Locker, щоб вимкнути HOME KEY та інші системні клавіші (наприклад, BACK KEY і MENU KEY)

Сподіваюся, це допоможе вам у вашій заявці. Дякую.


1
Це просто вимкніть кнопку жорсткого дому ... !!
Гаррі Шарма

У мене чудово працювало. Я, мабуть, хочу відключити всі фізичні кнопки, насправді ... Використовуючи це для Google Cardboard, щоб відключити кнопку Домашня сторінка, оскільки мій випадок потрапляє в неї.
Matt Cruikshank

як відключити кнопку останніх програм
user3106818

# shaobin0604 Ваш github-код не працює на пристрої Motorola.
Brajendra Pandey

11

Ви можете вимкнути кнопку домашнього та недавнього Android 5.0, використовуючи згадану тут функцію закріплення екрана :

Android 5.0 представляє новий API закріплення екрану, який дозволяє тимчасово обмежити користувачів не залишати завдання або перериватися сповіщеннями. Це може бути використано, наприклад, якщо ви розробляєте навчальний додаток для підтримки вимог до оцінки високих ставок на Android, або одноцільовий додаток або додаток-кіоск. Коли ваша програма активує закріплення екрану, користувачі не можуть бачити сповіщення, отримувати доступ до інших програм або повертатися на головний екран, поки ваша програма не вийде з режиму.

Ви можете заблокувати пристрій, щоб стати кіоском. Панель навігації не прихована, але кнопки головного екрана та останніх можна видалити або відключити залежно від того, як ви активуєте режим. Я написав деяку інформацію після тестування цієї функції тут .


6

Просто здогадуюсь, але я думаю, що з дозволу SYSTEM_ALERT_WINDOW (відображається як "Намалювати над іншими програмами", див. Тут ) це могло бути можливо: відобразити свій додаток у повноекранному вікні типу системного попередження . Таким чином він буде приховувати будь-які інші програми, навіть домашній екран, тому, якщо натиснути кнопку Home, він насправді не буде відключений, просто без видимих ​​ефектів.

У MX Player цей дозвіл задекларований, і у Facebook Messenger його також можна відображати " голови чату " над будь-чим - тому це може бути рішенням.

Оновлення (додано з моїх коментарів): Далі, використовуйте SYSTEM_UI_FLAG_HIDE_NAVIGATION у поєднанні з фіксацією подій дотику / за допомогою OnSystemUiVisibilityChangeListener, щоб замінити поведінку за замовчуванням (панель навігації відображається при дотику). Крім того, оскільки ви сказали, що вихідний занурювальний жест не працює, ви також можете спробувати встановити SYSTEM_UI_FLAG_IMMERSIVE_STICKY (із SYSTEM_UI_FLAG_FULLSCREEN та SYSTEM_UI_FLAG_HIDE_NAVIGATION).


Швидкий тест - додавання дозволу та виклик getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);- показує, що це приховає панель стану (і рух пальцем униз, як використовується для виходу з повноекранного режиму, не працює), але не панель навігації. Кнопки на цій панелі все ще функціонують.
nhaarman

Зараз у мене немає SDK, але моєю наступною ідеєю буде використання SYSTEM_UI_FLAG_HIDE_NAVIGATION спільно з фіксацією подій дотику / використання OnSystemUiVisibilityChangeListener для перевизначення поведінки за замовчуванням (панель навігації відображається при дотику).
molnarm

Крім того, оскільки ви сказали, що вихідний занурювальний жест не працює, ви також можете спробувати встановити SYSTEM_UI_FLAG_IMMERSIVE_STICKY (із SYSTEM_UI_FLAG_FULLSCREEN та SYSTEM_UI_FLAG_HIDE_NAVIGATION).
молнарм

4

Раніше можна було вимкнути кнопку «Домашня сторінка», а зараз ні. Це пов’язано зі зловмисним програмним забезпеченням, яке захоплює користувача.

Більше деталей ви можете побачити тут: Вимкнути головну кнопку в Android 4.0+

Нарешті, кнопку Назад можна відключити, як ви можете бачити в цьому іншому питанні: Вимкнути кнопку Назад в Android


2
Я щойно протестував плеєр MX, як він сказав на Nexus 4, і він дійсно заблокував кнопку додому = S
Pozzo Apps

Кнопка "Назад" призначена для роботи так, як вона призначена. Я б радив не відключати кнопку "Назад".
Рагхундан

Я бачу вашу думку, @Raghunandan, і погоджуюсь з цим. Тим не менше, кнопку Назад можна відключити, і я довіряю розробнику взяти це до уваги. Якщо йому вдасться порушити зручність використання його програми, користувачі повідомлять його про це.
Альваро Кавальканті

спробуйте встановити MX Player і протестувати його. Вона вимикає кнопку HOME. Це вимикає всі системні кнопки. MX Player використовує Kids Lock (плагін). Я намагався розібрати Kids Lock (плагін), але поки не знаю, як це працює. Ось чому я задаю це питання.
user1024

1
Зауважте, що ця відповідь не надає способу реалізації mx player цієї функції.
nhaarman

3

Якщо ви націлюєтеся на Android 5.0 і вище. Ви можете використовувати:

Activity.startLockTask()

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз’яснень від автора, залиште коментар під його публікацією - ви завжди можете коментувати власні публікації, і коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію . - З огляду
user1140237

1
@ user1140237 Чому ні?
Триларіон

1
Це можна зробити лише в тому випадку, якщо ви адміністратор пристрою, що звичайним додатком не повинно бути
Рон,

3

Спочатку створіть метод:

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);

    }

Тоді ви називаєте це за onCreate()методом вашої діяльності. Зателефонуйте ще раз за onResume()методом. Тоді ви можете додати інший метод у своїй діяльності, як це:

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

Це все. Пам’ятайте, що він буде блокувати екран до наступного разу, коли користувач торкнеться екрана, у класі Таймер ви можете змінити затримку, і це дозволить вам змінити речі для цього екземпляра. Потім екран знову заблокується.


2

Я теж деякий час шукав це, і нарешті зміг зробити це, як мені було потрібно, тобто панель навігації недоступна, рядок стану недоступний, навіть якщо ви довго натискаєте кнопку живлення, меню живлення та навігаційні кнопки не відображаються. Завдяки @Assaf Gamliel, його відповідь вивела мене на правильний шлях. Я дотримувався цього підручника з невеликими змінами. Вказуючи Тип, я вказав WindowManager.LayoutParams.TYPE_SYSTEM_ERRORзамість WindowManager.LayoutParams.TYPE_PHONE, інакше наше "накладання" не буде приховувати системні панелі. Ви можете пограти з прапорами, висотою, шириною тощо, щоб він поводився так, як вам хочеться.


1

я не знаю, як набрати домашню кнопку. доки мої знання я отримав наступне посилання.

перейдіть за посиланням: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME

Константа коду ключа: ключ додому. Цей ключ обробляється фреймворком і ніколи не доставляється додаткам.

Але ми можемо набрати кнопку "Назад". сподіваюся, наступний код вам допоможе.

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

2
Питання полягає в тому, щоб спеціально імітувати функціональність плеєра MX.
nhaarman

1

Оновлення старої теми. Я зміг досягти того, що моя активність не згинається, коли натискається кнопка додому (фізична або віртуальна). Ось мій код 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);

На API 26 і вище ви повинні отримати дозвіл на накладання екрана від користувача. Перевірено на Android 7 та 8.


0

Ви не можете вимкнути кнопку "Домашня сторінка" з ICS-мов, але ви можете вимкнути інші кнопки наступним чином

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

1
Питання полягає в тому, щоб спеціально імітувати функціональність плеєра MX.
nhaarman

0

Після ICS, тобто Android 4+, заміна HomeButton була вилучена з міркувань безпеки, щоб дозволити користувачеві вийти на випадок, якщо додаток виявиться шкідливим програмним забезпеченням.

Крім того, не дуже хороша практика - не дозволяти користувачеві відійти від програми. Але, оскільки ви робите програму блокування екрану, ви можете оголосити цю активність як панель запуску, так що при натисканні кнопки HomeBot вона просто перезапустить вашу програму і залишиться там самою (користувачі не помітять нічого, крім легкого мерехтіння на екрані).

Ви можете перейти за таким посиланням:

http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html


Питання полягає в тому, щоб спеціально імітувати функціональність плеєра MX.
nhaarman

0

Чесно кажучи, неможливо вимкнути кнопку головного екрана принаймні на нових рівнях API, тобто починаючи з 4.0. Це також не бажано робити. Однак ви можете заблокувати кнопку "Назад", замінивши

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

для того, щоб замінити головну кнопку, ви можете використовувати таймер, наприклад, і після кожного разу перевіряти, чи головним екраном є ваш екран чи ні, чи ваш пакет зверху чи ні, (я впевнений, ви отримаєте посилання на нього ), і відображати свою активність, використовуючи прапор single_top.

Таким чином, навіть якщо натиснути кнопку головного, ви зможете піднести свою програму на початок.

Також переконайтеся, що додаток має спосіб вийти, оскільки подібні програми дійсно можуть дратувати і ніколи їх не розробляти.

Щасливого кодування.

PS: Неможливо перехопити домашню подію, коли натиснута кнопка додому.

Ви можете використовувати методи прикріплення до вікна, а також методи захисту клавіш, але не для рівнів API від 4.0.


Питання полягає в тому, щоб спеціально імітувати функціональність плеєра MX.
nhaarman

@NiekHaarman, не дуже. Питання в тому, щоб "вимкнути кнопки" Домашня сторінка "," Назад "та всі інші системні кнопки". Зокрема LIKE MX плеєр, а не MIMIC.
Адам

@adam ні, щедрість, яку я поставив на запитання, яке спричинило цю відповідь, просив спеціально імітувати функціональність плеєра MX.
nhaarman

0

Використання обертання викликає виняток, тому я зафіксував свою активність за допомогою цього:

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);
}

Вам потрібно буде скористатися пропозицією @ Lê Quang Duy.


0

Я працюю над додатком, якому потрібно заблокувати планшет лише для програми. Спочатку я ставлю свою програму як MainLauncher, а потім блокую панель завдань за допомогою AndroidView. Нарешті я блокую планшет. Це не функція, яку я вказую використовувати для декількох моделей планшетів, оскільки кожна модель пристрою має функцію блокування.

Але загалом це працює для всіх. Ви можете використовувати команди

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

як приклад вимкнення кнопок. Але все базується на зміні системних файлів, всередині папки "/ system / usr / keylayout / ...". ПРИМІТКА. Працює лише на корінних пристроях.

Ще один спосіб, який я намагаюся, хоча все ще розробляю, - використовувати StreamWrite та StreamReader для доступу до RootDirectory та переписати весь файл, щоб вимкнути та увімкнути кнопки.

Сподіваюся, це допомагає.

І будь-які питання залишаються доступними.


0

Для тих, хто хоче повністю видалити програмне забезпечення навігації на вкоріненому (або спеціальному ПЗУ) пристрої Android, ви можете змінити build.propтекстовий файл у системній папці.

Встановіть таку змінну / значення:

gemu.hw.mainkeys=1

Це те, що постачальники використовують для відключення програмного навігації, коли у них є фізичні кнопки.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.