Android 在三星设备上保持屏幕开启

Android keep screen on on Samsung devices

我有一个流媒体应用程序,我想避免在流媒体时屏幕关闭。它适用于我的大多数设备,但不适用于某些三星设备(三星 Galaxy S21 Ultra、三星 Galaxy S10 等)。到目前为止我尝试了什么:

  1. 将此添加到我的 activity

    的 onCreate 视图
     this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    
  2. 在我的布局的根组件上添加 keepScreenOn xml

     android:keepScreenOn="true"
    
  3. 在我的 onCreate 中使用电源管理器防止屏幕关闭

     PowerManager powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
     this.wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "test.");
     this.wakeLock.acquire();
    

不管我做什么,Samsung 屏幕锁都会在一段时间后出现,如下图所示

WAKE_LOCK这样的权限当然是在Manifest中添加的。看起来很简单,但我不知道如何避免这种情况。我经常收到在三星设备上使用我的应用程序的用户的投诉,例如,当他们使用游戏手柄并且没有主动触摸屏幕时,屏幕会一直关闭。如何在三星设备上避免这种情况?它似乎在所有其他设备上都能正常工作。我之前还检查了很多堆栈溢出条目,但没有发现任何具体内容,但也许我错过了一些东西。谁能指出我正确的方向?

您可以使用以下代码执行此操作:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

更多信息:Android Documentation

我偶然发现了这个: https://dontkillmyapp.com/samsung

2021 年更新:尽管 Android 团队承诺强制 OEM 对非标准应用程序终止保持透明,但三星在 Android11 中引入了新的严格(默认开启)限制。应用程序无法再在前台服务中保持唤醒锁定。这打破了许多用例,例如健康应用程序现在无法为其用户收集感官数据。请在此处查看详细信息并阅读下面的解决方法。