我需要在我的Android应用程序中禁用Home和其他系统按钮。
示例: MX Player
(see at Google Play) - 您可以在播放器屏幕上按“锁定”图标,它会锁定所有硬件和软件系统按钮。
没有根据,它工作正常。
我在一些具有不同Android版本的设备上测试了它。我试图拆解Kids Lock(插件),但不知道它是如何工作的。
我需要像MX Player
的Kids Lock(插件)一样的解决方案:
- 禁用Home,Back和所有其他系统按钮。
有什么建议吗?
答案 0 :(得分:88)
首先,如果你真的想要禁用Home
按钮或任何其他按钮(例如Back
按钮),请仔细思考,这不是应该做的事情(至少在大多数情况下,这是一个糟糕的设计)。我只能为自己说话,但如果我下载的应用程序不允许我点击操作系统按钮,我接下来要做的就是卸载该应用并留下非常糟糕的评论。我也相信你的应用程序不会在App Store上展示。
现在...
请注意,MX Player
要求在其他应用程序之上绘制权限:
由于您无法覆盖Home
设备上的Android
按钮(在最新的OS版本中至少没有)。当您“锁定”应用并点击MX Player
按钮时,Home
会在您的启动器上显示自己。
要查看示例,可以更简单直接地理解,您可以看到Facebook Messenger App。
当我被要求提供有关MX Player Status Bar
和Navigation Bar
“覆盖”的更多信息时,我正在编辑我的答案以包含这些主题。
首先,MX Player在KitKat
上使用Immersive Full-Screen Mode(DevBytes Video)。
Android 4.4(API级别19)为SYSTEM_UI_FLAG_IMMERSIVE引入了一个新的setSystemUiVisibility()标记,可让您的应用真正“全屏”。此标记与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标志。请注意,标志的“粘性”版本不会触发任何侦听器,因为在此模式下临时显示的系统栏处于瞬态状态。
第二:Hiding the Status Bar
第三:Hiding the Navigation Bar
请注意,尽管使用沉浸式全屏仅适用于KitKat
,但隐藏Status Bar
和Navigation 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.java
从shaobin'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?。