【问题标题】:Lock Screen detect home button锁屏检测主页按钮
【发布时间】:2019-03-18 15:05:38
【问题描述】:

我最近下载了 ACDisplay 锁屏应用:

https://play.google.com/store/apps/details?id=com.achep.acdisplay

该应用程序在我的设备上显示一个覆盖,同时在activity 上检测到home button click,这样我就无法绕过锁定屏幕。它还能够以某种方式完全隐藏非根设备上的recent button。这怎么可能?

我浏览了以下链接:

Detect home button press in android

How can I detect user pressing HOME key in my activity?

How can I detect user pressing HOME key in my activity?

以及所有适用于旧版本 Android 的解决方案,或者他们说无法检测到 home 按钮点击,因为它可能被恶意应用程序使用。

这个应用程序是如何做到的?

有人可以分享示例代码/应用程序,说明如何防止用户在成功验证自己之前退出锁屏应用程序?

谢谢。

【问题讨论】:

    标签: android android-homebutton


    【解决方案1】:

    具有设备管理员权限 https://developer.android.com/guide/topics/admin/device-admin 您可以务实地锁定解锁设备。

    该应用程序还使用“检索正在运行的应用程序”android.permission.GET_TASKS 的权限,因此我们可以检测当前前台运行的应用程序。 检查答案。 https://stackoverflow.com/a/17756786/1025070 这样,如果用户尝试按 home 键并离开,我们可以即时检查应用程序是否处于前台,并再次重新启动我们的活动。 (它的解决方法是检测用户是否使用 Home press 离开应用程序)。

    检查我的应用程序https://play.google.com/store/apps/details?id=com.udayalakmal.applock&hl=en 在任何无法绕过的应用程序上添加锁屏覆盖。使用相同的检查前台运行应用程序。


    @user2511882 - 创建示例应用,在设备锁定时仅加载 Activity,在设备解锁时加载另一个 Activity

    https://github.com/UdayaLakmal/LockScreenDemo

    **这只是一个演示,您必须使用带有后台服务的接收器来继续监控设备锁定状态并处理内存泄漏。使用 Android 6 API 23 测试 无需监控正在运行的应用程序,因为这仅与设备锁定屏幕一起使用。

    **检查我如何在锁屏活动中获得主页按钮按下事件。

    【讨论】:

    • 您能否提供一个示例应用程序,演示如何在设备被用户锁定和解锁时将图像显示为锁定屏幕?
    • @user2511882 使用示例项目更新答案。在锁屏中它隐藏菜单按钮,也可以获得主页按钮按下事件,检查日志。
    • 您指向的stackoverflow链接清楚地表明该方法已从Android L及更高版本中弃用。在您的示例中,当我按下锁定按钮时,设备不会进入睡眠状态,因为有一个意图。我试图复制的是与 ACDisplay 相同的行为,如果重新打开屏幕,则锁定屏幕已经可见。请注意,它已经可见。换句话说,如果我按下电源按钮,锁定屏幕应该会在不唤醒设备的情况下发生,当我唤醒设备时,锁定屏幕应该已经到位。
    • @user2511882 当您询问“示例应用程序如何在用户锁定和解锁设备时将图像显示为锁定屏幕的示例”,演示仅在设备锁定和再次启动时启动活动解锁时。正如我在编辑中提到的那样,不需要运行任务,因为这仅在设备锁定时使用
    • 如果您只需要获取屏幕开/关事件,您可以注册github.com/UdayaLakmal/LockScreenDemo/blob/master/app/src/main/…filter.addAction(Intent.ACTION_SCREEN_ON);也可以在接收到广播事件时启动活动,并且永远运行它,你必须使用服务来做到这一点。
    【解决方案2】:
                WindowManager windowManager  = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
                WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
                } else {
                    layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
                }
                layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
                layoutParams.x = 0;
                layoutParams.y = 0;
                layoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
                View window = LayoutInflater.from(this).inflate(R.layout.activity_main, null, false);
    
                windowManager.addView(window, layoutParams);
    

    以下代码根据要求阻止了主页、返回和最近按钮。

    还需要清单中的以下权限:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    

    【讨论】:

      【解决方案3】:

      您不能禁用最近按钮和主页按钮,但您可以通过使用 窗口管理器 link 来实现这一点,在一行中它会在您的 android 应用程序屏幕上创建一个叠加层。

      【讨论】:

      • 那么应用程序是如何做到的呢?
      • 我用过,不知道内部是怎么用的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多