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

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

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

Он отлично работает без укоренения.

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

I нужно же решение, как дети блокировки (плагин) для MX Player: - отключить Home, Back и все другие системные кнопки.

какие предложения?

18 ответов


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

сейчас...

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

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

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

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

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

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

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

удачи в реализации этого, и получайте удовольствие!


я следовал shaobin0604 это!--5--> и мне наконец удалось заблокировать кнопку "Домой", добавив:

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

to AndroidManifest.xml все, что вам нужно сделать, это скопировать HomeKeyLocker.java С шаобинь это Либ в свой проект и реализовать его как в шаобинь это. Кстати: Android-версия моего AVD-это Android 4.0.3.


можно использовать Android-HomeKey-Locker чтобы отключить домашнюю клавишу и другие системные клавиши (например, клавишу "Назад" и клавишу Меню)

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


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

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

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


просто догадка, но я думаю с SYSTEM_ALERT_WINDOW разрешение (отображается как "Draw over other apps", см. здесь) можно: отобразить ваше приложение в полноэкранный, система оповещения типа


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

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

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


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


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

Activity.startLockTask()

Я не знаю, как кнопка diable home. пока мои знания я получил следующей ссылке.

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

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

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

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

сначала создайте способ :

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

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


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

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

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

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

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

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


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

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

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

таким образом, даже если кнопка home нажата, вы сможете довести свое приложение до вершины.

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

удачи в кодировании.

P. S: невозможно перехватить событие home при нажатии кнопки home.

вы можете использовать методы прикрепления к окну, а также методы keyguard, но не для уровни api начиная с 4.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.


обновление старой теме. Мне удалось добиться того, что моя активность не сворачивается при нажатии кнопки "Домой" (физическая или виртуальная). Вот мой код для деятельности 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.


Я работаю над приложением, которое должно заблокировать планшет только для приложения. Сначала я поместил свое приложение в качестве 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 для доступа к корневому каталогу и перезаписи всего файла для отключения и включения кнопок.

надеюсь, что это помогает.

и какие вопросы остаются доступными.


для тех, кто хочет полностью удалите soft-nav на корневом (или пользовательском ПЗУ) Android-устройства, вы можете изменить build.prop текстовый файл в системную папку.

установите следующую переменную / значение:

gemu.hw.mainkeys=1

это то, что поставщики используют для отключения мягкой навигации, когда у них есть физические кнопки.


извините за ответ через 2-3 года. но вы можете скрыть активность всех системных кнопок. Просто проверьте это мои ответы Как отключить кнопку виртуального дома в любой деятельности?.