Как отключить домашние и другие системные кнопки в Android?

Мне нужно отключить главную и другие системные кнопки в приложении для Android.

Пример: MX Player (см. в Google Play) - вы можете нажать значок "блокировка" на проигрывателе и он блокирует все кнопки аппаратной и программной системы.

Он отлично работает БЕЗ ВЕРНУТЬСЯ.

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

Мне нужно такое же решение, как Kids Lock (плагин) для MX Player: - отключить главную, заднюю и все остальные системные кнопки.

Любые предложения?

Ответ 1

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

Теперь...

Обратите внимание, что MX Player запрашивает разрешение на использование поверх других приложений: MX Player permissions
Поскольку вы не можете переопределить кнопку Home на устройстве Android (по крайней мере, в последних версиях ОС). MX Player рисует себя поверх вашей панели запуска, когда вы "блокируете" приложение и нажимаете кнопку Home.
Чтобы увидеть пример, который является более простым и понятным, вы можете увидеть Facebook Messenger App.

Поскольку меня попросили предоставить дополнительную информацию о MX Player Status Bar и Navigation Bar "overriding", я редактирую свой ответ, чтобы включить эти темы тоже.

Прежде всего, MX Player использует Иммерсивный полноэкранный режим (DevBytes Video) на KitKat.
Android 4.4 (API уровня 19) представляет новый флаг SYSTEM_UI_FLAG_IMMERSIVE для setSystemUiVisibility(), который позволяет вашему приложению поистине "полноэкранный". Этот флаг в сочетании с SYSTEM_UI_FLAG_HIDE_NAVIGATION и SYSTEM_UI_FLAG_FULLSCREEN, скрывает панели навигации и состояния и позволяет вашему приложению захватывать все события касания на экране.

При включенном полноэкранном режиме активность продолжает получать все события касания. Пользователь может отображать системные бары с внутренним проводом вдоль области, где обычно появляются панели системы. Это очищает флаг SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN, если они применяются), поэтому панели системы становятся видимыми. Это также запускает ваш View.OnSystemUiVisibilityChangeListener, если он установлен. Однако, если вы хотите, чтобы системные бары автоматически спрятались снова через несколько секунд, вы можете вместо этого использовать флаг SYSTEM_UI_FLAG_IMMERSIVE_STICKY. Обратите внимание, что "липкая" версия флага не вызывает каких-либо прослушивателей, поскольку системные бары, временно показанные в этом режиме, находятся в переходном состоянии.

Второе: Скрытие строки состояния
Третье: Скрытие панели навигации
Обратите внимание, что, хотя использование полноэкранного режима только для KitKat, скрытие Status Bar и Navigation Bar относится не только к KitKat.

Мне нечего сказать о 2-м и 3-м, у вас есть идея, которую я считаю, она быстро читается в любом случае. Просто убедитесь, что вы уделяете пристальное внимание View.OnSystemUiVisibilityChangeListener.

Я добавил Gist, который объясняет, что я имел в виду, он не завершен и нуждается в некоторой фиксации, но вы получите эту идею. https://gist.github.com/Epsiloni/8303531

Удачи вам в этом, и получайте удовольствие!

Ответ 2

Я выполнил ответ shaobin0604 и мне удалось заблокировать кнопку HOME, добавив:

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

to AndroidManifest.xml Все, что вам нужно сделать, это скопировать HomeKeyLocker.java из shaobin lib в ваш проект и реализовать его, как в пример shaobin. BTW: Моя версия AVD Android - Android 4.0.3.

Ответ 3

Вы можете использовать Android-HomeKey-Locker для отключения HOME KEY и других системных клавиш (таких как BACK KEY и MENU KEY)

Надеюсь, это поможет вам в вашем приложении. Спасибо.

Ответ 4

Вы можете отключить кнопку home and recents Android 5.0, используя функцию фиксации экрана, упомянутую здесь:

Android 5.0 представляет новый интерфейс для настройки экрана, который позволяет вам временно запретить пользователям оставлять вашу задачу или прерваться по уведомлениям. Это можно использовать, например, если вы разработка учебного приложения для поддержки оценки высоких ставок требования к Android, или одноцелевое приложение или приложение для киоска. Когда ваше приложение активирует привязку экрана, пользователи не могут видеть уведомления, доступ к другим приложениям или возврат на главный экран, пока ваше приложение выходит из режима.

Вы можете заблокировать устройство до киоска. Панель навигации не скрыта, но кнопки home и recents могут быть удалены или отключены в зависимости от того, как вы активируете режим. Я написал некоторую информацию после тестирования этой функции здесь.

Ответ 5

Просто догадайтесь, но я думаю, что с разрешением 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).

Ответ 6

Раньше можно было отключить кнопку "Домой", но теперь это не так. Это связано с вредоносным программным обеспечением, которое будет ловить пользователя.

Здесь вы можете увидеть больше деталей: Отключить главную кнопку в Android 4.0+

Наконец, кнопка "Назад" может быть отключена, как вы можете видеть в этом другом вопросе: Отключить кнопку "Назад" на Android-телефоне

Ответ 7

Я тоже некоторое время искал это, и, наконец, смог сделать это по мере необходимости, т.е. панель навигации недоступна, строка состояния недоступна, даже если вы долго нажимаете кнопку питания, ни меню питания, ни кнопки навигации не показано на рисунке. Благодаря @Assaf Gamliel, его ответ привел меня на правильный путь. Я последовал за этим руководством с небольшими изменениями. При указании типа я указал WindowManager.LayoutParams.TYPE_SYSTEM_ERROR вместо WindowManager.LayoutParams.TYPE_PHONE, иначе наш "overlay" не скроет системные бары. Вы можете играть с флагами, высотой, шириной и т.д., Чтобы он вел себя так, как вы этого хотите.

Ответ 8

Если вы нацелились на Android 5.0 и выше. Вы можете использовать:

Activity.startLockTask()

Ответ 9

Я не знаю, как можно нажимать кнопку дома. до тех пор, пока мои знания я получил ниже.

перейдите по ссылке: - http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME

Key code константа: главный ключ. Этот ключ обрабатывается инфраструктурой и никогда не доставляется в приложения.

Но мы можем поменять кнопку назад. надеюсь, что следующий код поможет вам.

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

Ответ 10

Сначала создайте метод:

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

Это будет так. Помните, что он заблокирует экран, пока в следующий раз пользователь не коснется экрана, в классе Timer вы можете изменить задержку, и это позволит вам изменить вещи для этого экземпляра. Затем он снова заблокирует экран.

Ответ 11

Вы не можете отключить кнопку "Главная" из ICS onwords, но можете отключить другие кнопки следующим образом

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

Ответ 12

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

Кроме того, не очень хорошая практика не позволять пользователю перемещаться от приложения. Но, поскольку вы создаете приложение блокировки экрана, то вы можете сделать это как Launcher, так что, когда нажата кнопка HomeButton, он просто перезапустит ваше приложение и останется там сам (пользователи не заметят ничего, кроме небольшого мерцания на экране).

Вы можете перейти по следующей ссылке:

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

Ответ 13

Откровенно говоря, невозможно отключить домашнюю кнопку, по крайней мере, на новых уровнях api, начиная с 4.0 и выше. Это также не рекомендуется делать. Однако вы можете заблокировать кнопку "Назад", переопределив

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

чтобы переопределить кнопку "домой", вы можете использовать таймер, например, и после каждого раза проверять, является ли основной экран вашим экраном или нет, или ваш пакет находится сверху или нет (я уверен, что вы получите ссылки на него) и отображать вашу активность, используя флаг single_top.

Таким образом, даже если кнопка "Дом" нажата, вы сможете перенести свое приложение вверх.

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

Счастливое кодирование.

P.S: Невозможно перехватить домашнее событие, когда нажата кнопка "домой".

Вы можете использовать при подключении к методам окна, а также к методам keyguard, но не для уровней api начиная с 4.0.

Ответ 14

Использование вращения вызывает исключение. Поэтому я исправил свою активность, используя следующую команду:

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.

Ответ 16

Обновление старой темы. Я смог добиться того, что моя активность не сбрасывается при нажатии кнопки "домой" (физическая или виртуальная). Вот мой код для действия 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 и abovem вам нужно получить разрешение экрана на экран пользователя. Протестировано на Android 7 и 8.