【问题标题】:Show dialog with touch events over lockscreen in Android 2.3在 Android 2.3 的锁屏上显示带有触摸事件的对话框
【发布时间】:2013-06-23 13:01:39
【问题描述】:

我想构建一个在锁屏上可见并且可以接收触摸事件的对话框。我用WindowManager 构建了一个窗口,但在GB(Android 2.3.7)的锁屏上只显示TYPE_SYSTEM_OVERLAY 标志。

有没有办法在 Android 2.3.7 中创建一个在锁屏上可见并且可以接收触摸事件的系统覆盖?

FLAG_WATCH_OUTSIDE_TOUCH 存在一个错误,但我不确定这对我有何影响。有什么想法吗?

【问题讨论】:

标签: android overlay android-windowmanager


【解决方案1】:

如果不以编程方式将您的应用程序绑定为管理员特权应用程序,我认为您无法在每次设备锁定时启动活动。

一旦您的应用成为管理员特权应用,您可以通过编程方式设置密码并锁定屏幕,然后使用Device Policy Manager 以编程方式解锁。

在该锁定屏幕上,您可以以编程方式启动自己的活动,并且您可以通过该活动创建自己的解锁器和解锁设备,因为您可以通过DeviceAdminReceiver 获得回电。

Here 就是一个很好的例子,您只需在调用 DevicePolicyManager.lockNow() 后创建自己的活动。然后它将作为正常活动显示在锁屏顶部,并额外控制原生锁屏。

【讨论】:

  • 谢谢你。我测试了它,但它不起作用。我在devicePolicyManager.lockNow() 之后添加了startActivity(new Intent(this, MainActivity.class)),但在锁定屏幕上看不到活动。我误会你了吗?
  • 你是否设置了标志 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);在该活动的 OnCreate 中。否则不会出现。
  • 好的,你对这个标志是正确的,活动在锁屏上是可见的。但是,如果我想为活动设置一个高度,使其不会填满整个屏幕,它就不再可见。我试过这个代码:layout.height = 200; window.setAttributes(layout); 有没有办法让这个活动出现在锁屏前?
【解决方案2】:

试试这个可能对你有帮助,

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.alertdialog);

而且,Android 有点矛盾。它非常开放,作为开发人员,您可以访问任何内容,并且您可以将这些权力用于善恶。当我说邪恶时,我并不是指恶意软件。我的意思是那些试图变得可爱并以不应该被使用的方式使用东西的应用程序,比如发布通知,要求你更多地使用该应用程序。矛盾之处在于,您实际上并不能访问所有内容,开发人员认为有一些部分非常重要,以至于应用程序无法处理它们。锁定屏幕就是其中之一。您可以随心所欲地更换您的家庭应用程序,但您永远不必担心更换锁屏失败并阻止您访问您的手机。

即使这是可能的,你也会有更多的问题需要处理。每个锁定屏幕都不同,制造商可以并且确实对其进行自定义,因此您无法保证您的活动不会妨碍手机解锁。

对于在对话之外进行触摸,

dialog.setCanceledOnTouchOutside(your boolean);

【讨论】:

    【解决方案3】:

    最后我也做到了。不要进行活动,因为出于安全原因,Android 不会在您的活动后面显示锁定屏幕,所以为了服务。

    下面是我的代码在我的服务的 onStartCommand 中

    WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
    View mView = mInflater.inflate(R.layout.score, null);
    
    WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
        PixelFormat.RGBA_8888);
    
    mWindowManager.addView(mView, mLayoutParams);
    

    【讨论】:

    • @patrick 不,不可能获取锁定屏幕上显示的任何窗口的触摸事件。如果您向其添加触摸事件,则在您的窗口而不是锁定屏幕后面显示启动器。这样做是出于安全目的。
    • 很遗憾,我需要这样的东西,幸运的是,当我按下小部件中的按钮时,我设法显示了一个叠加层:)
    • 非常感谢。它帮助了我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多