默认锁定屏幕上的Android活动


74

如何在锁定屏幕上显示ActivityDialog可见?

我已经尝试通过在Activity.onCreate()方法中设置各种窗口类型来打开屏幕时显示我的锁定活动:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

和其他人以及SYSTEM_ALERT_WINDOWINTERNAL_SYSTEM_WINDOW权限。

解锁设备后,我的活动可见。

更新:

我实际上已经设法显示自己的活动,而不是默认的锁定屏幕。除非您使用HOME按钮,否则它可以完美工作。


1
您到底想完成什么?您是要实现自己的锁定屏幕还是要在锁定屏幕上显示警报窗口(无论是什么)还是...?
Eugene Mayevski'Callback

1
实际上,我希望能够同时实现:自己的锁定屏幕和现有锁定屏幕上的对话框。
plugmind

2
您可以发布该代码吗?
彼得

2
@plugmind:我遇到了同样的问题,您能分享您的代码以供参考吗?
Mehul Joisar

2
@plugmind,您是否已完成所需的任务,我在同一时间停留....
Abdul Wahab

Answers:


122
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

尝试在活动开始时使用此标志禁用锁定屏幕。

在API级别17之后,您可以使用

<activity
        android:name=".yourActivityName"
        android:showOnLockScreen="true"
        android:screenOrientation="sensorPortrait" >

像示例中的showOnLockScreen ...


2
这甚至不需要任何权限。奇怪。
某处某人2014年

4
对于我而言不起作用,是否需要任何特殊许可?
Shirish Herwade,2014年

6
问题是,至少在4.4上,当锁定屏幕上设置了密码时,此功能不起作用。有谁知道如何保持锁定屏幕但仍然能够显示其锁定对话框?
哈比卜·艾哈迈德

2
有谁知道在锁定屏幕进行自定义活动的情况下如何拒绝主页按钮?主页按钮只是关闭活动并显示主屏幕。
X-HuMan 2014年

@karate有固定屏幕- developer.android.com/about/versions/android-5.0.html,但它似乎并不很容易使用(应用程序必须有设备所有者的权限)
阳光明媚岚

33

不要进行活动,因为出于安全原因,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);

并添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />到清单


1
我可以用它在显示屏顶部显示布局。但是,即使添加事件处理程序,它也不会接收事件。如何克服这个问题?
nagylzs 2015年

@nagylzs不会接收事件,因为要在锁定屏幕上显示应用程序屏幕(不是系统应用程序)是一种妥协。这是安全问题。通常,Android不允许您在具有触摸事件的锁定屏幕上显示屏幕(例如,您可以通过在锁定屏幕上显示透明屏幕来窃取某些密码)
Shirish Herwade 2015年

1
您是否尝试使用TYPE_SYSTEM_ERROR来接收事件?
Vivek MVK

锁定屏幕上的布局未不覆盖整个移动屏幕的全屏状态下显示。如何覆盖整个移动屏幕
Sabari Karthik

找不到layout.score,请提供帮助。
塔哈·苏丹·特穆里

19

在onCreate方法中使用它

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
// This line should be before setContentView..      
setContentView(......);

希望这会工作谢谢


@Subha,您是否得到任何解决方案来避免在电话响起时显示。闹钟响了吗?
Android Guy

0

您可以在此处认为有效的任何答案中使用代码。然后,要阻止“主页”按钮起作用,请将TYPE_SYSTEM_ALERT或更改为TYPE_SYSTEM_OVERLAY(取决于您当前使用的)TYPE_SYSTEM_ERROR

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP;
mOverlay = (RelativeLayout) inflater.inflate(R.layout.main, (ViewGroup) null);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.