如何在屏幕锁定时显示Activity?

29

我的应用程序在汽车对接事件上启动,我希望在插入设备时唤醒手机(由系统完成),并解锁屏幕。

这是否可能?


1
希望不是这样,我可不想我的手机随时解锁!(我可能会误拨电话...) - GôTô
2
我很想把它编辑成“如何在屏幕锁定时显示我的活动”,因为在Android中你无法通过程序解锁设备... - StrikeForceZero
2
正如SrikeForceZero所解释的那样,您无法通过编程方式“解锁”设备。下面的答案似乎表明您可以这样做,但实际上它们只是展示了如何使特定的Activity在设备整体保持锁定状态的情况下变得交互 - Chris Stratton
4个回答

44

我正在使用此方法将活动提升到顶层

    private Window wind;
    @Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    /******block is needed to raise the application if the lock is*********/
    wind = this.getWindow();
    wind.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
    wind.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    wind.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
    /* ^^^^^^^block is needed to raise the application if the lock is*/
}

1
谢谢。它完美地工作,即使我将其放在OnCreate上。 - Cerin
我不知道。请测试这个方法并告诉我们! - RN3KK Nick
4
不适用于 KitKat。屏幕会亮起来,但活动直到用户解锁屏幕后才会显示。 - vold_by
完美。正是我所需要的。谢谢。 - Arshad

21
使用Activity.getWindow()来获取您的Activity的窗口;使用Window.addFlags()添加您想要的WindowManager.LayoutParams中的以下标志之一:FLAG_DISMISS_KEYGUARDFLAG_SHOW_WHEN_LOCKEDFLAG_TURN_SCREEN_ON
这是标准汽车底座(和桌面底座)应用程序实现此行为的方式。

很酷,它可以工作,但这些标志只适用于SDK版本5及更高版本 :( - mishkin
2
发现了通用的方法,可以在这里查看我的答案 https://dev59.com/DHA65IYBdhLWcg3wzyFl#4541982 - mishkin
主要问题是无法将其作为服务在ICS上运行。我甚至尝试创建一个可以实现此功能的活动。 - Archimedes Trajano
1
目前API 5及以上版本已经占据了市场的99%左右。当你可以直接使用这些标志时,我认为没有必要使用技巧。 - hackbod
对我来说,这个好像不起作用。我在我的活动的onCreate()中添加了标志,该活动由我的BroadcastReceiver调用,在AlarmManager设置的闹钟到来时调用。onCreate被调用,标志被设置,但手机仍然是黑屏和锁定状态。 - Yar
@Yar,你最终解决了这个问题吗?我也遇到了同样的问题。 - Forrest Bice

4

当使用图案锁或PIN码输入时,我还需要添加以下内容,因为屏幕在不到5秒的时间内就会关闭:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

4

只有没有启用安全锁(例如图案锁)的手机才能使用FLAG_DISMISS_KEYGUARD

如果用户尝试移动到其他地方,FLAG_SHOW_WHEN_LOCKED 只会将您当前的 Activity 置于顶部,他必须解锁屏幕。

或者,您可以在清单中添加权限:

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

并且,在你的活动中创建:

KeyguardManager manager = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock lock = manager.newKeyguardLock("abc");
lock.disableKeyguard(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接