Skip to content

setGameScreenStateChangeListener

设置屏幕状态变化监听器

setGameScreenStateChangeListener 用于处理小游戏发起的屏幕属性修改请求。在游戏运行过程中,JS 层可能会通过 API 申请改变屏幕亮度(如进入暗光关卡)或设置屏幕常亮(防止游戏过程中熄屏)。

由于修改系统屏幕设置涉及用户体验甚至系统权限,SDK 不会自动执行这些操作,而是通过此监听器询问宿主 App 的意见。


方法声明

java
/**
 * 设置小游戏屏幕状态变化监听器。
 * 当小游戏想要改变屏幕属性(亮度、常亮)时调用。
 *
 * @param listener 屏幕状态监听器
 */
void setGameScreenStateChangeListener(SUDRTGameHandle.GameScreenStateChangeListener listener);

内部接口定义

java
public interface GameScreenStateChangeListener {
    /**
     * 小游戏请求改变屏幕亮度。
     * @param brightness 目标亮度值(通常为 0.0 到 1.0)
     * @return 返回 true 允许修改;返回 false 拒绝修改。
     */
    boolean queryChangeScreenBrightness(float brightness, Bundle info);

    /**
     * 小游戏请求设置屏幕常亮。
     * @param keepOn 是否常亮
     * @return 返回 true 允许修改;返回 false 拒绝修改。
     */
    boolean queryChangeScreenKeepOn(boolean keepOn, Bundle info);
}

运行行为

  1. 决策权在 App:此监听器采用“请求-确认”模式。只有当回调返回 true 时,引擎才会根据参数尝试调整底层窗口属性。
  2. 默认行为:如果不设置此监听器,小游戏发起的相关 JS 调用通常会静默失败或被 SDK 忽略。
  3. UI 线程:该回调通常在游戏线程执行,如果 App 需要在此时弹出原生提示或修改 UI 元素,需注意线程同步。

代码示例

java
gameHandle.setGameScreenStateChangeListener(new SUDRTGameHandle.GameScreenStateChangeListener() {
    @Override
    public boolean queryChangeScreenBrightness(float brightness, Bundle info) {
        // 示例:如果亮度太低(小于 0.1),为了用户眼睛着想,拒绝修改
        if (brightness < 0.1f) {
            Log.w("SUDOP", "Requested brightness too low, ignoring.");
            return false; 
        }
        
        // 允许修改,SDK 会尝试修改当前 Activity 的窗口亮度
        return true;
    }

    @Override
    public boolean queryChangeScreenKeepOn(boolean keepOn, Bundle info) {
        // 游戏通常需要保持常亮,这里建议直接同意
        Log.d("SUDOP", "Screen keep on requested: " + keepOn);
        
        // 返回 true 后,SDK 会自动为当前 Activity 
        // 设置/清除 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        return true;
    }
});

注意事项

  • 返回值的重要性:如果您的 App 有全局的节能模式或亮度控制逻辑,可以通过 queryChangeScreenBrightness 的返回值来屏蔽游戏的请求。
  • Activity 生命周期:这些设置通常只对当前运行游戏的 Activity 窗口生效。一旦 Activity 销毁,系统会自动恢复默认状态。
  • 权限说明:修改屏幕常亮通常不需要特殊权限,但如果引擎尝试修改系统级亮度(而非仅仅是当前窗口),可能需要 Android 的 WRITE_SETTINGS 权限(取决于具体的 SDK 内部实现,通常仅限窗口级)。