如何在不使用TYPE_KEYGUARD的情况下禁用Home键?

时间:2011-09-28 12:54:41

标签: android android-layout android-manifest android-notifications

我创建一个锁屏应用程序,我需要禁用一个主页按钮,所以如果该手机被盗,该手机无法访问..我的锁屏是一个全屏活动..我使用此代码禁用主页按钮,但它给了我一些bug。这是代码:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    }

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

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return false;
    }

代码给了我一些像通知/状态区一样的错误,即使我在全屏模式下活动仍然可以访问,如果我关闭我的显示并再次打开它..错误是这样的:

第一次启动应用程序:(仍然没问题)

enter image description here

我从电源按钮关闭屏幕后再将其打开: enter image description here

主要问题是在锁屏上..当仍然可以访问通知区域时,锁屏无用..

任何想法如何解决这个问题?请帮忙..

按下结束键按钮时,我也面临同样的问题。

7 个答案:

答案 0 :(得分:4)

对于我的手机,TYPE_KEYGUARD似乎覆盖了全屏,没有标题栏主题。通知栏始终存在。试试这个:

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

让您的视图拉伸整个屏幕,它将覆盖通知区域。您的通知区域可能仍然是可点击的(隐形),但我相信如果您捕获到视图中的所有关键事件,它不应传播到栏中。

答案 1 :(得分:4)

这适用于上述问题..

@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
    KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
    lock.disableKeyguard();
    }

添加android.permission.DISABLE_KEYGUARD权限并将android:theme="@android:style/Theme.NoTitleBar.Fullscreen"提供给应用

答案 2 :(得分:2)

在我的Samusung Pocket中,没有任何上述工作正常。经过进一步的搜索,我终于可以做到了。

我把它们全部放在AndroidMainfest.xml中,如下所示(不在Acitivity代码中):

<activity
    android:name=".geo.activity.LockActivity"
    android:theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" />

在您的活动中使用keygurad onAttachedToWindow()方法:

@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
    KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
    lock.disableKeyguard();
}

正是我想要的。关闭/打开后,阻止HOME按钮。

答案 3 :(得分:1)

这很简单,你应该在onAttachedToWindow()方法中禁用keyguard:

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();

答案 4 :(得分:1)

试试这段代码:

@Override
 public void onAttachedToWindow() {
  // TODO Auto-generated method stub
     super.onAttachedToWindow();  

     handler.postDelayed(mUpdateUiMsg, 100);

 }


 public boolean onKeyDown(int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  if(keyCode==KeyEvent.KEYCODE_BACK){
   return true;
  }
  if(keyCode==KeyEvent.KEYCODE_HOME){
   return true;
  }

  return super.onKeyDown(keyCode, event);
 }


 private Runnable mUpdateUiMsg = new Runnable() {
        public void run() {


            getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);


         }
    };

答案 5 :(得分:1)

对于锁屏为什么不使用以下内容:

@Override
public void onAttachedToWindow() {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}

如果用户没有设置安全锁定屏幕,应用程序将在您的应用关闭时转到主屏幕。如果用户确实设置了安全锁屏,那么无论您的应用如何关闭,标准安全锁屏都会出现。我想我不会担心禁用按钮。应该允许用户使用标准安全功能,因为它们提供了更高的安全性,您可以通过应用程序保证。此外,您不必花时间编写安全解锁功能。

答案 6 :(得分:0)

您无法控制Home Button的行为。它将完成任务,您需要调整您的应用程序要求。

对于全屏,请在清单文件的活动代码中添加:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"