默认锁定屏幕上的 Android 活动

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3629179/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 11:03:52  来源:igfitidea点击:

Android activity over default lock screen

androidandroid-activitydialoglockscreenandroid-windowmanager

提问by plugmind

How can I display an Activityor Dialogto be visible over the lock screen?

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

I have already tried displaying my lock activity when screen turns on by setting various window type in Activity.onCreate()method:

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

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

and others together with SYSTEM_ALERT_WINDOWand INTERNAL_SYSTEM_WINDOWpermissions.

和其他人一起SYSTEM_ALERT_WINDOWINTERNAL_SYSTEM_WINDOW权限。

My activity is visible after I unlock the device.

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

UPDATE:

更新:

I actually already managed to display my own Activity instead of default lock screen. It work perfectly unless you use HOME button.

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

回答by Enes

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);

try using this flags to disable lock screen when the activity is started.

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

After API level 17 you can use

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

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

showOnLockScreen like in the example...

showOnLockScreen 就像示例中的一样...

回答by Shirish Herwade

Don't go for activity, because android will not show lock screen behind your activity for security reason, so use service instead of Activity.

不要去活动,因为出于安全原因android不会在您的活动后面显示锁定屏幕,所以使用服务而不是活动。

Below is my code in onStartCommand of my service.

下面是我在服务的 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);

And add <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />to manifest

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

回答by SarwarCSE

Use this in onCreate method

在 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(......);

Hope this will work Thanks

希望这会奏效谢谢

回答by A. N

You can use code in any of answers here that you think it's working. Then to prevent HOMEbutton to work, change TYPE_SYSTEM_ALERTor TYPE_SYSTEM_OVERLAY(depends on what you currently use) to TYPE_SYSTEM_ERROR:

您可以在此处的任何您认为有效的答案中使用代码。然后为了防止HOME按钮工作,将TYPE_SYSTEM_ALERTTYPE_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);