【问题标题】:Modify home button behaviour for lock screens in android修改android中锁定屏幕的主页按钮行为
【发布时间】:2016-08-01 12:38:51
【问题描述】:

我正在 android studio 中开发一个锁屏应用程序。我知道我们不能禁用 HOME 按钮。但是Play商店上有很多锁屏应用程序。他们是怎么做到的?当我在这些应用程序中按下主页按钮时,没有任何反应。类型 keyguard 已弃用,也已弃用 keylocker。请告诉我如何让主页按钮不做任何事情或在同一个屏幕上。现在,我不想将其设为主屏幕,因为它让用户可以选择在主屏幕之间进行选择,而且我正在开发一个锁屏应用程序,所以如果这是唯一的解决方案,那么请告诉我如何将我的屏幕设为主屏幕以编程方式。请给出正确答案。

【问题讨论】:

  • 实现onKeyDown() 方法并抓住按钮按下。
  • 谢谢@MujammilAhamed,但我说的是android现在已经改变了。我的意思是 Keylocker 不存在,keyguard 不存在,TYPE_KEYGUARD 也不存在。所以,请参考我今天可以使用的代码。
  • 谢谢@Shark 你能举个例子或参考吗?

标签: android lockscreen


【解决方案1】:

正如 Shark 所说,您需要覆盖您的 Activity OnKeyDown。 只需将以下代码复制并粘贴到您的活动中即可。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub

        if( (keyCode==KeyEvent.KEYCODE_HOME)
        {
            // *** DO YOUR STUFF HERE ***
            return true;
        }
           else
             return super.onKeyDown(keyCode, event);
    }

它将处理点击主页按钮。

【讨论】:

    【解决方案2】:

    在谷歌上大量搜索后。我终于找到了解决方案。我在 GitHub 上找到了它。如果有人感兴趣。只需复制以下类:

    your package name;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.MotionEvent;
    import android.view.WindowManager;
    import android.widget.FrameLayout;
    import com.amigo.hammad.screenlock7292016.R;
    
    import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
    import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    
    public class HomeKeyLocker {
    private OverlayDialog mOverlayDialog;
    
    public void lock(Activity activity) {
        if (mOverlayDialog == null) {
            mOverlayDialog = new OverlayDialog(activity);
            mOverlayDialog.show();
        }
    }
    
    public void unlock() {
        if (mOverlayDialog != null) {
            mOverlayDialog.dismiss();
            mOverlayDialog = null;
        }
    }
    
    private static class OverlayDialog extends AlertDialog {
    
        public OverlayDialog(Activity activity) {
            super(activity, R.style.AppTheme);
            WindowManager.LayoutParams params = getWindow().getAttributes();
            params.type = TYPE_SYSTEM_ERROR;
            params.dimAmount = 0.0F; // transparent
            params.width = 0;
            params.height = 0;
            params.gravity = Gravity.BOTTOM;
            getWindow().setAttributes(params);
            getWindow().setFlags(FLAG_SHOW_WHEN_LOCKED | FLAG_NOT_TOUCH_MODAL, 0xffffff);
            setOwnerActivity(activity);
            setCancelable(false);
        }
    
        public final boolean dispatchTouchEvent(MotionEvent motionevent) {
            return true;
        }
    
        protected final void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            FrameLayout framelayout = new FrameLayout(getContext());
            framelayout.setBackgroundColor(0);
            setContentView(framelayout);
        }
    }
    }
    

    您可能会在 super(activity, R.style.AppTheme); 上发现错误这条线。您只需要提供您的应用主题即可。

    然后你需要在锁屏的onCreate方法中创建一个Object。并调用锁函数。例如:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Object of Class HomeKeyLocker.
        mHomeKeyLocker = new HomeKeyLocker();
        setContentView(R.layout.yourActivityLayoutName);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        // Calling Function in Class HomeKeyLocker to Block Home Button on this Activity.
        mHomeKeyLocker.lock(this);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多