如何禁用Android中的家庭和其他系统button?

我需要在我的Android应用程序中禁用家庭和其他系统button。

示例: MX Player ( 请参阅Google Play ) – 您可以在播放器屏幕上按“locking”图标,并locking所有硬件和软件系统button。

它工作正常,没有根。

我在一些使用不同Android版本的设备上testing过它。 我试图反汇编儿童锁(插件),但不知道它是如何工作的。

我需要像MX Player的Kids Lock(插件)一样的解决scheme: – 禁用Home,Back和所有其他系统button。

有什么build议么?

Solutions Collecting From Web of "如何禁用Android中的家庭和其他系统button?"

首先,如果你真的想禁用Homebutton或其他button(例如Backbutton),请认真考虑,这不是应该做的事情(至less大部分时间,这是一个坏devise)。 我只能为自己说话,但是如果我下载的应用程序不允许我像点击操作系统button那样做,接下来我要做的是卸载该应用程序,并留下一个非常糟糕的评论。 我也相信,你的应用程序将不会在App Store上的function。

现在…

请注意, MX Player正在请求允许在其他应用程序之上绘制: MX播放器权限
由于您无法覆盖Android设备上的Homebutton(至less在最新的操作系统版本中没有)。 当您“locking”应用程序并单击Homebutton时, MX Player会在您的启动器上自动绘制。
要看到一个例子是更简单和直接了解,你可以看到Facebook Messenger的应用程序 。

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

首先,MX Player在KitKat上使用Immersive全屏模式 ( DevBytes Video )。
Android 4.4(API Level 19)为setSystemUiVisibility( )引入了一个新的SYSTEM_UI_FLAG_IMMERSIVE标志,可以让您的应用程序真正实现“全屏”。 此标志与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 BarNavigation Bar不仅适用于KitKat

关于第二和第三,我没什么好说的,你知道我相信这个想法,无论如何,这是一个快速阅读。 只要确保你密切关注View.OnSystemUiVisibilityChangeListener 。

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

祝你好运,并乐在其中!

我跟着shaobin0604的回答 ,终于设法lockingHOMEbutton,join:

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

AndroidManifest.xml所有你需要做的就是从HomeKeyLocker.java 的lib中复制HomeKeyLocker.java到你的项目,并像shaobin的例子一样实现它。 BTW:我的AVD的Android版本是Android 4.0.3

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

希望这会帮助你在你的应用程序。 谢谢。

您可以使用此处提到的屏幕lockingfunction来禁用Android 5.0的home和recentsbutton:

Android 5.0引入了新的屏幕lockingAPI,可让您临时限制用户离开任务或被通知中断。 例如,如果您正在开发教育应用程序以支持Android上的高风险评估要求,或者使用单一用途或自助服务terminal应用程序,则可以使用此function。 一旦您的应用程序激活屏幕固定,用户不能看到通知,访问其他应用程序,或返回到主屏幕,直到您的应用程序退出该模式。

您可以将设备locking为信息亭。 导航栏不隐藏,但是根据激活模式的不同,可以删除或禁用home和recentsbutton。 我在这里testing了这个function后写了一些信息。

只是一个猜测,但我认为与SYSTEM_ALERT_WINDOW权限(显示为“绘制其他应用程序”,看到这里 )它可能是:显示您的应用程序为全屏, 系统警报types窗口。 这样,它将隐藏任何其他应用程序,甚至主屏幕,所以如果按Home键,它将不会被禁用,只是没有任何可见的效果。

MX播放器已经声明了这个权限,而且Facebook Messenger也拥有这个权限来显示“ 聊天头 ”,所以它可能是解决scheme。

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

它曾经可以禁用主页button,但现在不是。 这是由于恶​​意软件会诱使用户。

你可以在这里看到更多详细信息: 在Android 4.0+中禁用主页button

最后,后退button可以被禁用,你可以在这个问题中看到: 在android中禁用后退button

我也一直在寻找这个,最后能够做到这一点,即导航栏不可访问,状态栏是无法访问的,即使你长时间按下电源button,电源菜单和导航button都不显示。 感谢@Assaf Gamliel,他的回答使我走上了正确的道路。 我稍微修改了一下本教程。 在指定Type时,我指定了WindowManager.LayoutParams.TYPE_SYSTEM_ERROR而不是WindowManager.LayoutParams.TYPE_PHONE ,否则我们的“覆盖”不会隐藏系统栏。 你可以玩标志,高度,宽度等,以便它的行为,你想要的。

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

 Activity.startLockTask() 

我不知道如何拨打首页button。 只要我的知识,我folowing链接。

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

密钥代码常量:主密钥。 该密钥由框架处理,绝不会传递给应用程序。

但是,我们可以拨回button。 希望以下代码可以帮助你。

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

首先创build一个方法:

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

然后你在你的activity的onCreate()方法上调用它。 在onResume()方法上再次调用它。 那么你可以在你的活动中添加另外一个方法:

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

就是这样。 请记住它将locking屏幕,直到下次用户触摸屏幕时,在Timer类中,您可以更改延迟,并允许您更改此实例,然后再次locking屏幕。

你不能禁用ICS的关键字,但可以禁用其他button,如下所示

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

发布ICS(即Android 4+)后,出于安全原因,HomeButton的重写已被删除,以便在应用程序变成恶意软件的情况下允许用户退出。

另外,不让用户远离应用程序,这不是一个好习惯。 但是,由于您正在制作锁屏应用程序,因此您可以将活动声明为启动程序,以便在按HomeButton时它将简单地重新启动应用程序并保持在那里(用户只会注意到一点闪烁在屏幕上)。

你可以通过以下链接:

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

坦率地说,至less在新的api级别,即从4.0开始,禁用homebutton是不可能的。 这样做也不可取。 但是,您可以通过重写屏蔽后退button

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

为了覆盖主页button,你可以使用计时器,例如,每次检查主屏幕是否是你的屏幕,或者你的软件包是否在最前面,(我相信你会得到它的链接),并使用标志single_top显示您的活动。

这样,即使主页button被按下,您将能够将您的应用程序顶部。

另外请确保应用程序有一个退出的方式,因为这样的应用程序可以真的很烦人,不应该开发。

快乐的编码。

PS:当主页button被按下时,不可能拦截家庭事件。

您可以使用附加窗口方法和键盘保护方法,但不能用于从4.0开始的api级别。

使用旋转导致一个exception,所以我已经解决了我的活动使用这个:

 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 Duybuild议。

对不起,2-3年后回答。 但是你可以隐藏所有系统button的活动。 只需检查我的答案如何禁用任何活动的虚拟主页button? 。

刷新一个老话题。 我能够实现我的活动不折叠时,主页button(物理或虚拟)被按下。 这里是我的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上testing