奥利奥(8.1)无法在锁屏状态下启动活动

6
我正在开发一个NFC支付应用程序。即使设备已锁定,只要屏幕亮着,就可以进行付款,这与Android Pay的行为基本相同。在付款后,我想向用户显示胜利屏幕,以通知他有关付款结果(完成、错误、PIN请求等)。我将此添加到清单中。
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

在onCreate方法中,我设置了这些标志。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_FULLSCREEN
            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

大多数设备上都能正常工作。但是,一旦我将 Nexus 5X 更新到 Android 8.1 后,它就停止工作了。NFC 交易在后台完成,没有任何问题,但是当我的手机处于锁屏状态且屏幕已打开时,胜利屏幕根本没有显示出来。当 5X 解锁后,它会毫无问题地启动活动。然后我发现,只有在应用程序不在后台运行时(当我进入设置并强制停止我的应用程序时),它才不能正常工作。当我打开应用程序并将其留在后台时,然后锁定手机并打开屏幕时,它可以正常工作。但是当应用程序完全未运行时,它将无法显示我的活动。在其他设备上,如搭载 Andorid 7.0 的 Samsung S8 上,即使我强制停止我的活动并锁定手机,它也可以正常工作。我在 Nexus 5X 上测试了 Android Pay 并在锁屏时工作。因此,在锁屏时启动活动仍然是可能的,但我可能遗漏了某些内容。谢谢您的帮助。

为使用Android Pay/NFC Pay,手机必须解锁以授权付款。这是一项安全功能。 - mast3rd3mon
你的问题已经得到了我的回答。谢谢,伙计。 - Bugs Happen
即使没有KEY_GUARD权限,它也可以正常工作。 - Bugs Happen
@Sandak您好,我遇到了同样的问题。请问您在调用Victory活动时是否在调用意图中添加了任何标志?谢谢。 - Muhammad Farhan
1个回答

12

在 Android 8.1 (API 27) 上,WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKEDWindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 已经过时。

现在你应该将以下内容添加到你的清单文件中的 activity 元素内:

android:showWhenLocked="true"
android:turnScreenOn="true"

完美的即时回答!谢谢 - Stepan Sanda
1
对于那些担心警告“Attribute showWhenLockedturnScreenOn仅适用于API级别27及以上”的人来说,这个警告不会影响任何低于27的设备。 - Bugs Happen
太棒了!你救了我的命! - Zinc
成功了!在我的情况下,我错过了android:showWhenLocked="true" - eugeneek
1
在Oneplus 6T上仍然无法工作,这些解决方案可以帮助您吗?@Benjamin - Priyanka Chauhan

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