【问题标题】:How to disable Home button without using the TYPE_KEYGUARD?如何在不使用 TYPE_KEYGUARD 的情况下禁用主页按钮?
【发布时间】:2011-09-28 12:54:40
【问题描述】:

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

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

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

第一次申请启动:(还是没问题)

在我通过电源按钮关闭屏幕并再次打开后:

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

知道如何解决这个问题吗?请帮忙..

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 你好@e_x_p 我也面临同样的问题。按下结束按钮后,您的解决方案也不起作用。按下结束按钮后,通知区域再次可见。
    • TYPE_KEYGUARD 在 SDK 14 以上的版本中已被弃用。它在目标 ADK 版本 21 中根本不起作用。
    • @KristyWelsh Exactly TYPE_KEYGUARD 在 SDK 14 以上的版本中已被弃用。您是否找到任何替代解决方案?提前致谢。
    • java.lang.IllegalArgumentException: 添加窗口后无法更改窗口类型。
    【解决方案2】:

    这是解决上述问题的方法..

    @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" 授予应用程序

    【讨论】:

    • KeyguardLock 已弃用!!有什么选择?
    【解决方案3】:

    在我的 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按钮。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        试试这个代码:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

            对于全屏,请在清单文件的活动标签中添加此内容:

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

            【讨论】:

            • 我可以用这个禁用主页按钮:@Override public void onAttachedToWindow() { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); } 但它给了我一些像上图一样的错误.. 有什么想法吗?
            • 感谢您的回答.. 我已经添加了该代码以进行全屏活动,但问题是当我关闭屏幕并再次打开它时,它会给我一些错误,例如上图.. :(
            • 嗨迈克尔....你确定你提供的上述代码可以禁用主页按钮..因为我使用了相同的代码但主页按钮没有被禁用......你能帮忙吗我?
            • 您当然可以控制主页按钮。也许在发布此类声明之前搜索 SO。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-29
            • 2011-08-17
            • 1970-01-01
            • 2019-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多