如何禁用Android中的Home和其他系统按钮?

时间:2013-07-09 13:28:49

标签: android locking kiosk

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

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

没有根据,它工作正常。

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

我需要像MX Player的Kids Lock(插件)一样的解决方案: - 禁用Home,Back和所有其他系统按钮。

有什么建议吗?

18 个答案:

答案 0 :(得分:88)

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

现在...

请注意,MX Player要求在其他应用程序之上绘制权限:MX Player permissions
由于您无法覆盖Home设备上的Android按钮(在最新的OS版本中至少没有)。当您“锁定”应用并点击MX Player按钮时,Home会在您的启动器上显示自己。
要查看示例,可以更简单直接地理解,您可以看到Facebook Messenger App

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

首先,MX Player在KitKat上使用Immersive Full-Screen ModeDevBytes Video)。
Android 4.4(API级别19)为SYSTEM_UI_FLAG_IMMERSIVE引入了一个新的setSystemUiVisibility()标记,可让您的应用真正“全屏”。此标记与SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN标记结合使用时会隐藏导航和状态栏,并让您的应用捕获屏幕上的所有触摸事件。

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

第二:Hiding the Status Bar
第三:Hiding the Navigation Bar
请注意,尽管使用沉浸式全屏仅适用于KitKat,但隐藏Status BarNavigation Bar不仅适用于KitKat

关于第二和第三,我没有太多话要说,你得到了我相信的想法,无论如何都是快速阅读。请务必密切关注View.OnSystemUiVisibilityChangeListener

我添加了一个Gist,它解释了我的意思,它不完整,需要一些修复,但你会得到这个想法。 https://gist.github.com/Epsiloni/8303531

祝你好运,并享受乐趣!

答案 1 :(得分:12)

我跟着shaobin0604's answer,我终于设法锁定HOME按钮,添加:

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

AndroidManifest.xml您所要做的就是将HomeKeyLocker.javashaobin's lib复制到您的项目中,并像shaobin's example一样实施。顺便说一句:我的AVD的Android版本是 Android 4.0.3

答案 2 :(得分:11)

您可以使用Android-HomeKey-Locker禁用HOME KEY和其他系统键(例如BACK KEY和MENU KEY)

希望这会对您的申请有所帮助。感谢。

答案 3 :(得分:10)

您可以使用提及here的屏幕固定功能停用Android 5.0的主页和最近按钮:

  

Android 5.0引入了一个新的屏幕固定API,可以让你   暂时限制用户离开任务或被中断   通过通知。例如,如果你这样做,可以使用它   开发教育应用程序以支持高风险评估   Android或单一用途或信息亭应用程序的要求。   一旦您的应用激活屏幕固定,用户就看不到了   通知,访问其他应用程序或返回主屏幕,直到   您的应用退出模式。

您可以将设备锁定为自助服务终端。导航栏未隐藏,但根据激活模式的方式,可以删除或禁用主页和最近按钮。我在测试了这个功能here之后写了一些信息。

答案 4 :(得分:6)

只是一个猜测,但我认为使用SYSTEM_ALERT_WINDOW权限(显示为“绘制其他应用”,请参阅here)可能是:将您的应用显示为全屏,{{3窗口。这样它就会隐藏任何其他应用程序,甚至是主屏幕,所以如果你按Home键,它就不会被真正禁用,只是没有任何明显的效果。

MX Player已声明此权限,而Facebook Messenger也可以显示“system alert type”,因此它可能是解决方案。

更新(从我的评论中添加):接下来,将SYSTEM_UI_FLAG_HIDE_NAVIGATION与捕获触摸事件一起使用/使用OnSystemUiVisibilityChangeListener覆盖默认行为(触摸时出现导航栏)。此外,由于您说退出沉浸式手势不起作用,您也可以尝试设置SYSTEM_UI_FLAG_IMMERSIVE_STICKY(使用SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_HIDE_NAVIGATION)。

答案 5 :(得分:4)

以前可以禁用Home按钮,但现在不能。这是由于恶​​意软件会使用户陷入困境。

您可以在此处查看更多详细信息:Disable Home button in Android 4.0+

最后,可以停用“后退”按钮,正如您在其他问题中看到的那样:Disable back button in android

答案 6 :(得分:2)

首先创建一个方法:

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类中,您可以更改延迟,它将允许您更改该实例的内容。然后它将再次锁定屏幕。

答案 7 :(得分:2)

我也在寻找这个,并且最终能够按照我的需要进行操作,即导航栏无法访问,状态栏无法访问,即使您长按电源按钮,电源菜单和导航按钮都不是所示。感谢@Assaf Gamliel,他的回答让我走上了正确的道路。 我按照this教程稍作修改。在指定类型时,我指定了WindowManager.LayoutParams.TYPE_SYSTEM_ERROR而不是WindowManager.LayoutParams.TYPE_PHONE,否则我们的&#34;覆盖&#34;不会隐藏系统栏。您可以使用旗帜,高度,宽度等,以便它能够按照您的意愿行事。

答案 8 :(得分:2)

如果您的目标是Android 5.0及以上版本。你可以使用:

Activity.startLockTask()

答案 9 :(得分:1)

我不知道如何拨打主页按钮。 只要我的知识,我得到了以下链接。

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

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

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

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

答案 10 :(得分:0)

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

设置以下变量/值:

<强> gemu.hw.mainkeys=1

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

答案 11 :(得分:0)

我正在处理一个需要锁定平板电脑才能应用的应用程序。 首先,我将我的应用程序作为MainLauncher,然后使用AndroidView锁定任务栏。 最后我阻止了平板电脑。 我指示在多个平板电脑型号中使用它不是一项功能,因为每个设备型号都有一个功能可以阻止它。

但总体而言,它适用于所有人。 您可以使用命令

{{1}}

作为禁用按钮的示例。但一切都是基于更改系统文件,在文件夹&#34; / system / usr / keylayout / ...&#34;内。 注意:仅适用于有根设备。

我尝试开发的另一种方法是使用StreamWrite和StreamReader访问RootDirectory并重写整个文件以禁用和启用按钮。

希望这有帮助。

任何问题仍然存在。

答案 12 :(得分:0)

刷新旧主题。 当按下主页按钮(物理或虚拟)时,我能够实现我的活动不会折叠。以下是我的活动代码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上测试过。

答案 13 :(得分: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êQuangDuy建议。

答案 14 :(得分:0)

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

来阻止后退按钮
public void onBackPressed() {
    // do not call super onBackPressed.
}

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

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

同时确保应用程序有退出方式,因为这类应用程序确实很烦人,而且永远不应该开发。

快乐的编码。

P.S:当按下主页按钮时,无法拦截主页事件。

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

答案 15 :(得分:0)

发布ICS即Android 4+,出于安全原因删除了HomeButton的覆盖,以便在应用程序被证明是恶意软件时启用用户退出。

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

您可以浏览以下链接:

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

答案 16 :(得分:0)

您无法从ICS onwords禁用Home按钮,但可以禁用其他按钮,如下所示

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

答案 17 :(得分:-3)

很抱歉在2 - 3年后回答。但您可以隐藏所有系统按钮的活动。请检查我的答案How to disable virtual home button in any activity?