You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android下Unity游戏运行时屏幕自动熄灭问题求助

解决Unity Android游戏屏幕自动熄灭的问题

嘿,我帮你梳理下可能的问题点和解决方案——你遇到的这个屏幕自动熄灭的情况,在Unity开发和Android系统的结合里确实有几个容易踩的坑,咱们一步步来:

1. 先试试Unity内置的最简方案

其实Unity本身就提供了保持屏幕常亮的API,完全不用写原生Android代码,你可以在游戏启动的脚本(比如入口场景的AwakeStart方法里)加上这一行:

Screen.sleepTimeout = SleepTimeout.NeverSleep;

这个API会直接告诉系统,只要游戏在前台运行,就不要让屏幕休眠。很多开发者都忽略了这个原生支持,先试试这个,大概率能解决问题。

2. 排查你之前用的两种方案的问题

如果你还是想用原生Android的方式,那之前的两种方案可能存在使用误区:

关于FLAG_KEEP_SCREEN_ON

  • 你需要确保这段代码是在Unity的主Activity(也就是UnityPlayerActivity)上执行的,而不是其他自定义Activity。如果是在Unity里通过C#调用原生代码,正确的写法应该是:
using UnityEngine;
using System;

public class KeepScreenOn : MonoBehaviour
{
    void Start()
    {
        try
        {
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject window = currentActivity.Call<AndroidJavaObject>("getWindow");
            const int FLAG_KEEP_SCREEN_ON = 128; // 对应WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON的常量值
            window.Call("addFlags", FLAG_KEEP_SCREEN_ON);
        }
        catch (Exception e)
        {
            Debug.LogError("Failed to set keep screen on: " + e.Message);
        }
    }
}
  • 另外,这个Flag不需要额外的权限,只要在前台Activity上设置就生效。

关于PowerManager唤醒锁

你之前用的PARTIAL_WAKE_LOCK是错误的类型!这个锁只会保持CPU运行,不会阻止屏幕熄灭。你需要改用以下类型:

  • SCREEN_BRIGHT_WAKE_LOCK:保持屏幕高亮,键盘背光可能关闭
  • SCREEN_DIM_WAKE_LOCK:保持屏幕处于低亮度状态

而且需要注意:

  1. AndroidManifest.xml里添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
  1. 正确的C#调用代码示例:
using UnityEngine;
using System;

public class WakeLockManager : MonoBehaviour
{
    private AndroidJavaObject wakeLock;

    void Start()
    {
        try
        {
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaClass powerManagerClass = new AndroidJavaClass("android.os.PowerManager");
            AndroidJavaObject powerManager = currentActivity.Call<AndroidJavaObject>("getSystemService", "power");
            const int SCREEN_BRIGHT_WAKE_LOCK = 0x0000000Full; // 对应PowerManager.SCREEN_BRIGHT_WAKE_LOCK
            wakeLock = powerManager.Call<AndroidJavaObject>("newWakeLock", SCREEN_BRIGHT_WAKE_LOCK, "MyGame:WakeLockTag");
            wakeLock.Call("acquire");
        }
        catch (Exception e)
        {
            Debug.LogError("Failed to acquire wake lock: " + e.Message);
        }
    }

    void OnDestroy()
    {
        if (wakeLock != null)
        {
            wakeLock.Call("release");
            wakeLock = null;
        }
    }
}
  • 别忘了在游戏退出或场景销毁时释放唤醒锁,避免不必要的电量消耗。

3. 考虑Android系统和厂商的限制

从Android 10开始,很多厂商(比如小米、华为、OPPO等)都加强了电池优化,即使你设置了屏幕常亮,系统的“智能省电”或“应用休眠”功能也可能强制让屏幕熄灭。解决方法:

  • 手动设置:引导用户进入手机设置,找到你的游戏,将其加入“电池优化白名单”或“后台保护列表”(不同厂商的叫法不同)。
  • 代码申请权限:你可以在游戏里请求系统忽略电池优化,需要在AndroidManifest.xml里添加:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

然后在C#里触发请求:

using UnityEngine;
using System;

public class BatteryOptimization : MonoBehaviour
{
    public void RequestIgnoreBatteryOptimizations()
    {
        try
        {
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
            string action = intentClass.GetStatic<string>("ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS");
            AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
            AndroidJavaObject uri = uriClass.CallStatic<AndroidJavaObject>("fromParts", "package", currentActivity.Call<string>("getPackageName"), null);
            AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", action, uri);
            currentActivity.Call("startActivity", intent);
        }
        catch (Exception e)
        {
            Debug.LogError("Failed to request ignore battery optimizations: " + e.Message);
        }
    }
}

最后再检查几个小细节

  • 确保游戏一直在前台运行,没有被系统切换到后台(比如用户按了Home键),后台应用的屏幕常亮设置会被系统忽略。
  • 有些设备的“自动亮度调节”或“护眼模式”可能会让屏幕看起来变暗,但实际上并没有熄灭,可以排除这种情况。

内容的提问来源于stack exchange,提问作者Franz

火山引擎 最新活动