82

我需要在我的 Android 应用程序中禁用主页和其他系统按钮。

示例:( MX Player参见Google Play)- 您可以在播放器屏幕上按“锁定”图标,它会锁定所有硬件和软件系统按钮。

无需生根即可正常工作。

我在一些具有不同 Android 版本的设备上对其进行了测试。我试图拆卸 Kids Lock(插件),但还不知道它是如何工作的。

我需要与儿童锁(插件)相同的解决方案MX Player: - 禁用主页、返回和所有其他系统按钮。

有什么建议么?

4

18 回答 18

94

首先,如果您真的想禁用Home按钮或任何其他按钮(例如Back按钮),请仔细考虑,这不是应该做的事情(至少在大多数情况下,这是一个糟糕的设计)。我只能为自己说话,但如果我下载了一个不允许我执行诸如单击操作系统按钮之类的操作的应用程序,那么我接下来要做的就是卸载该应用程序并留下非常糟糕的评价。我也相信你的应用不会出现在 App Store 上。

现在...

请注意,这MX Player是要求在其他应用程序之上绘制的权限:MX 播放器权限
因为您不能覆盖设备Home上的按钮Android(至少在最新的操作系统版本中没有)。MX Player当您“锁定”应用程序并单击Home按钮时,它会在您的启动器顶部绘制。
要查看一个更简单且易于理解的示例,您可以查看Facebook Messenger 应用程序

当我被要求提供有关 MX PlayerStatus BarNavigation Bar“覆盖”的更多信息时,我正在编辑我的答案以包含这些主题。

首先,MX PlayerKitKat.
Android 4.4(API 级别 19)为setSystemUiVisibility( ) 引入了一个新的SYSTEM_UI_FLAG_IMMERSIVE标志,让您的应用真正“全屏”运行。此标志与SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN标志结合使用时,会隐藏导航栏和状态栏,并让您的应用程序捕获屏幕上的所有触摸事件。

启用沉浸式全屏模式后,您的 Activity 将继续接收所有触摸事件。用户可以通过沿着系统栏通常出现的区域向内滑动来显示系统栏。这将清除SYSTEM_UI_FLAG_HIDE_NAVIGATION标志(以及SYSTEM_UI_FLAG_FULLSCREEN标志,如果应用的话),因此系统栏变得可见。这也会触发您的View.OnSystemUiVisibilityChangeListener(如果已设置)。但是,如果您希望系统栏在片刻后再次自动隐藏,则可以改用SYSTEM_UI_FLAG_IMMERSIVE_STICKY标志。请注意,标志的“粘性”版本不会触发任何侦听器,因为在此模式下临时显示的系统栏处于瞬态状态。

二:隐藏状态栏
三:隐藏导航栏
请注意,虽然使用沉浸式全屏仅适用于KitKat,但隐藏Status BarNavigation Bar并不仅仅适用于KitKat

关于第 2 和第 3,我没有太多要说的,你明白我相信的想法,无论如何这是一个快速阅读。只要确保密切关注View.OnSystemUiVisibilityChangeListener 即可

我添加了一个要点来解释我的意思,它不完整,需要一些修复,但你会明白的。https://gist.github.com/Epsiloni/8303531

祝你好运,玩得开心!

于 2014-01-06T07:54:34.103 回答
14

我按照shaobin0604 的回答,终于设法锁定 HOME 按钮,添加:

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

您所要做的就是从shaobin 的 libAndroidManifest.xml复制到您的项目中,并像在shaobin 的示例中那样实现它。顺便说一句:我的 AVD 的 Android 版本是Android 4.0.3HomeKeyLocker.java

于 2014-04-28T19:26:31.897 回答
14

You can use Android-HomeKey-Locker to disable HOME KEY and other system keys(such as BACK KEY and MENU KEY)

Hope this will help you in your application. Thanks.

于 2014-03-23T06:07:44.357 回答
12

您可以使用此处提到的屏幕固定功能禁用主页和最近按钮 Android 5.0 :

Android 5.0 引入了一个新的屏幕固定 API,可让您暂时限制用户离开您的任务或被通知打断。例如,如果您正在开发一个教育应用程序以支持 Android 上的高风险评估要求,或者一个单一用途或信息亭应用程序,则可以使用此方法。一旦您的应用激活屏幕固定,用户将无法看到通知、访问其他应用或返回主屏幕,直到您的应用退出该模式。

您可以将设备锁定为信息亭。导航栏没有隐藏,但可以删除或禁用主页和最近按钮,具体取决于您激活模式的方式。我在这里测试了这个功能后写了一些信息。

于 2014-10-19T11:35:36.627 回答
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)。

于 2014-01-05T12:39:30.870 回答
4

以前可以禁用 Home 按钮,但现在不行了。这是由于会诱骗用户的恶意软件。

您可以在此处查看更多详细信息:在 Android 4.0+ 中禁用主页按钮

最后,可以禁用后退按钮,正如您在另一个问题中看到的那样:禁用 android 中的后退按钮

于 2013-07-09T13:35:19.147 回答
3

如果您的目标是 android 5.0 及更高版本。你可以使用:

Activity.startLockTask()
于 2016-02-05T05:27:54.437 回答
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();
    }

就是这样。请记住,它会锁定屏幕,直到用户下次触摸屏幕,在 Timer 类中,您可以更改延迟,它将允许您更改该实例的内容。然后它将再次锁定屏幕。

于 2017-05-25T05:14:45.207 回答
2

我也一直在寻找这个,终于可以根据需要进行操作,即无法访问导航栏,无法访问状态栏,即使您长按电源按钮,也不会显示电源菜单和导航按钮。感谢@Assaf Gamliel,他的回答让我走上了正确的道路。我按照教程进行了一些细微的修改。在指定类型时,我指定WindowManager.LayoutParams.TYPE_SYSTEM_ERROR而不是WindowManager.LayoutParams.TYPE_PHONE,否则我们的“覆盖”不会隐藏系统栏。您可以使用标志、高度、宽度等,以便它按照您的意愿行事。

于 2014-09-21T14:08:03.243 回答
1

我不知道如何禁用主页按钮。只要我的知识我得到以下链接。

参考链接:- http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME

键码常量:Home键。此密钥由框架处理,永远不会传递给应用程序。

但是,我们可以禁用后退按钮。希望以下代码可以帮助您。

@Override
public void onBackPressed() {
    //return nothing 
    return;
}
于 2014-01-06T11:45:49.000 回答
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 上测试。

于 2017-12-21T09:53:34.763 回答
0

在 ICS 即 Android 4+ 之后,出于安全原因,已删除了 HomeButton 的覆盖,以便在应用程序被证明是恶意软件的情况下允许用户退出。

另外,不让用户离开应用程序并不是一个很好的做法。但是,由于您正在制作一个锁屏应用程序,您可以做的是将活动声明为 Launcher ,这样当按下 HomeButton 时,它会简单地重新启动您的应用程序并自行保持在那里(用户只会注意到轻微的闪烁在屏幕上)。

您可以通过以下链接:

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

于 2014-01-07T13:12:04.030 回答
0

Using rotation causes an exception, So I've fixed my activity using this:

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

You will need to use the @Lê Quang Duy suggestion.

于 2014-08-01T18:01:48.703 回答
0

坦率地说,至少在新的 api 级别,即从 4.0 开始,禁用主页按钮是不可能的。也不建议这样做。但是,您可以通过覆盖

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

为了覆盖主页按钮,您可以使用计时器,例如,每次检查主屏幕是否是您的屏幕,或者您的包裹是否在顶部,(我相信您会获得指向它的链接),并使用标志 single_top 显示您的活动。

这样,即使按下主页按钮,您也可以将您的应用程序带到顶部。

还要确保应用程序有退出方式,因为这种应用程序真的很烦人,永远不应该开发。

快乐编码。

PS:当home键被按下时,无法拦截home事件。

您可以使用 on attach to window 方法和 keyguard 方法,但不能用于 4.0 以后的 api 级别。

于 2014-01-07T16:06:41.903 回答
0

您不能从 ICS onwords 禁用主页按钮,但可以禁用其他按钮,如下所示

@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent){
   return true;
}
于 2014-01-07T07:27:43.253 回答
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 并重写整个文件以禁用和启用按钮。

希望这可以帮助。

并且任何问题仍然可用。

于 2018-02-16T19:48:32.613 回答
0

对于任何希望在根(或自定义 ROM) android 设备上完全删除软导航的人,您可以修改build.prop系统文件夹中的文本文件。

设置以下变量/值:

gemu.hw.mainkeys=1

当供应商有物理按钮时,这就是供应商用来禁用软导航的方法。

于 2018-05-30T11:57:20.997 回答
-3

抱歉,2-3 年后才回答。但您可以隐藏所有系统按钮的活动。只需检查我的答案如何在任何活动中禁用虚拟主页按钮?.

于 2016-01-21T13:35:25.777 回答