如何禁用主页键

35

我想锁定屏幕。我希望禁用主页键,只使用返回键。如何实现?


2
看这里,快速的答案似乎是你需要实现一个主屏幕替换:https://dev59.com/UFHTa4cB1Zd3GeqPPTPJ https://dev59.com/9nI95IYBdhLWcg3wxA4-#3955217 https://dev59.com/YW865IYBdhLWcg3wnf9t http://www.toddlerlock.com/3.html - mishkin
你好,你有解决方案吗?我也在尝试禁用我的锁屏应用程序的Home键,但是它不起作用。 - Vaishali Sharma
5个回答

30
使用此方法禁用 Android 中的 Home 键。
@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
}

5
这是否适用于全屏的SurfaceView和MediaPlayer?似乎不行。哦,我明白了:在这种情况下,TYPE_KEYGUARD_DIALOG有效。 - Yar
2
通知栏仍然会出现,将通知栏下拉后,按下主页键会返回主屏幕。有什么解决方法吗?Theme.Black.NoTitleBar和requestWindowFeature(Window.FEATURE_NO_TITLE)都不起作用。 - Ragunath Jawahar
我尝试使用SurfaceView和TYPE_KEYGUARD_DIALOG,效果非常好。 - Mohammed Subhi Sheikh Quroush
7
它会抛出"illegalstate exception"的异常。 - Anand Savjani
7
这似乎在现代 Android 版本上无法使用。它会抛出一个异常,表明无法在添加窗口后更改窗口的类型。 - Grishka
显示剩余4条评论

23

我找到了一种解决HOME键的方法。 对于您的应用程序,请将清单设置为

<action android:name="android.intent.action.MAIN" />              
<category android:name="android.intent.category.HOME" />                 
<category android:name="android.intent.category.DEFAULT" />               
<category android:name="android.intent.category.MONKEY"/>

现在你的应用是一个备用启动器应用程序。

使用adb,并使用包管理器禁用启动器应用程序。

pm disable com.android.launcher2
现在按下Home键将始终停留在同一个屏幕上。

1
pm disable com.android.launcher2 应该改为 pm disable com.android.launcher。 - kakopappa
@kakopappa,包启动器不再使用。包名为launcher2。请在Git中检查代码。 - amiekuser
我尝试过这样做,但是我并没有完全明白该怎么做。你能否给我源代码以获取更多细节?谢谢。 - Datta Kunde
嗨,我只想禁用主页键而不是返回键。如何实现这一点? - Aada
我已经在清单文件中的活动中添加了上述属性,但是即使我将我的应用程序设置为默认主屏幕,主页按钮仍然会带我到启动器主屏幕。我该怎么办? - Umer Farooq
谢谢,兄弟,你救了我的一天,我该如何卸载这个应用程序 :) 只需禁用这些过滤器: <category android:name="android.intent.category.MONKEY" /> <category android:name="android.intent.category.HOME" /> - Muhammad

13

这个解决方案仅适用于3.x及以下版本。

好的,本来这应该是一个难题。但是下面是一种破解方法。

在您的Activity中覆盖以下方法:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

现在像这样处理按键事件:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if(keyCode == KeyEvent.KEYCODE_HOME)
    {
     Log.i("Home Button","Clicked");
    }
   if(keyCode==KeyEvent.KEYCODE_BACK)
   {
        finish();
   }
 return false;
}

在理想情况下,KEYCODE_HOME 永远不会返回给任何应用程序。 - JoxTraex
7
我的应用程序出现以下错误:java.lang.IllegalArgumentException: 窗口类型无法在添加窗口后更改。 - Daniel Winterstein
我将setType()调用从onAttached移动到onCreate -- 现在没有崩溃,但主页按钮没有被禁用。 - Daniel Winterstein
即使API级别设置为ICS以下? - ravemir

9

将以下代码添加到你的MainActivity类中:

Timer timer;
MyTimerTask myTimerTask;

@Override
protected void onResume() {
    super.onResume();

    if (timer != null) {
        timer.cancel();
        timer = null;
    }
}

@Override
protected void onPause()
{
    if (timer == null) {
        myTimerTask = new MyTimerTask();
        timer = new Timer();
        timer.schedule(myTimerTask, 100, 100);
    }

    super.onPause();
}

private void bringApplicationToFront()
{
    KeyguardManager myKeyManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
    if( myKeyManager.inKeyguardRestrictedInputMode())
        return;

    Log.d("TAG", "====Bringging Application to Front====");

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    try
    {
        pendingIntent.send();
    }
    catch (PendingIntent.CanceledException e)
    {
        e.printStackTrace();
    }
}

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

class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        bringApplicationToFront();
    }
}

这并不是针对“主页”按钮的锁定,但用户在很长一段时间内(超过100毫秒)无法切换到其他应用程序,也许这正是您想要的。


避免闪烁,请将此行更改为 timer.schedule(myTimerTask, 1, 100);,而不是 timer.schedule(myTimerTask, 100, 100); - Manthan Patel

1

禁用主页按钮,请尝试以下方法:

@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
}

下拉通知栏时出现的问题可以通过像这样隐藏通知栏来解决:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.xxxx);
    getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN);
    ....
}

或者在清单文件中为您的Activity或Application设置全屏主题:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接