默认锁定屏幕上的 Android 活动
Posted
技术标签:
【中文标题】默认锁定屏幕上的 Android 活动【英文标题】:Android activity over default lock screen 【发布时间】:2011-04-07 10:47:01 【问题描述】:如何在锁定屏幕上显示Activity
或Dialog
?
我已经尝试通过在Activity.onCreate()
方法中设置各种窗口类型来在屏幕打开时显示我的锁定活动:
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD
和其他人一起拥有SYSTEM_ALERT_WINDOW
和INTERNAL_SYSTEM_WINDOW
权限。
解锁设备后我的活动可见。
更新:
我实际上已经设法显示我自己的活动而不是默认的锁定屏幕。除非您使用 HOME 按钮,否则它可以完美运行。
【问题讨论】:
您到底想完成什么?您是在尝试实现自己的锁定屏幕还是希望在锁定屏幕上显示警报窗口(无论是什么)还是...? 其实我希望我能够同时实现:自己的锁屏和现有锁屏上的对话框。 你能发布那个代码吗? @plugmind:我遇到了同样的问题,你能分享你的代码以供参考吗? @plugmind,你完成了要求的任务吗,,,我还是一样…… 【参考方案1】: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);
尝试使用此标志在 Activity 启动时禁用锁定屏幕。
在 API 级别 17 之后,您可以使用
<activity
android:name=".yourActivityName"
android:showOnLockScreen="true"
android:screenOrientation="sensorPortrait" >
showOnLockScreen 就像示例中一样...
【讨论】:
这甚至不需要任何权限。令人惊讶。 在我的情况下不起作用,是否需要任何特殊权限? 问题是,至少在 4.4 上,当锁定屏幕上设置了密码时,这不起作用。有谁知道如何保持锁定屏幕打开,但仍然能够在上面显示对话? 有谁知道如何在锁定屏幕的自定义活动的情况下拒绝主页按钮?主页按钮只是关闭活动并返回主屏幕。 @karate 有Screen Pinning - developer.android.com/about/versions/android-5.0.html,不过好像不太好用(app必须有Device Owner权限)【参考方案2】:不要进行活动,因为出于安全原因,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" />
添加到清单
【讨论】:
我可以使用它在显示屏顶部显示布局。但即使我添加事件处理程序,它也不会接收事件。如何克服这个问题? @nagylzs 它不会接收事件,因为能够在锁定屏幕上显示您的应用程序屏幕(不是系统应用程序)是一种妥协。是安全问题。一般来说Android不允许你在有触摸事件的锁屏上显示你的屏幕,(例如你可以通过在锁屏上显示一个透明的屏幕来窃取一些密码) 您是否尝试使用 TYPE_SYSTEM_ERROR 来接收事件? 锁屏上的布局没有全屏显示,没有覆盖整个手机屏幕。如何覆盖整个手机屏幕 layout.score not found 请帮忙。【参考方案3】:在 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,你有什么解决方案可以避免在电话响铃时显示。闹钟响了?【参考方案4】:您可以在此处的任何答案中使用您认为有效的代码。然后为了防止 HOME 按钮起作用,请将 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);
【讨论】:
以上是关于默认锁定屏幕上的 Android 活动的主要内容,如果未能解决你的问题,请参考以下文章
Android Galaxy S4 -- 在锁定屏幕上可见的活动