如何调用SurfaceControl.setDesiredDisplayConfigSpecs修改屏幕分辨率

如何调用SurfaceControl.setDesiredDisplayConfigSpecs修改屏幕刷新率,在android studio中写一个设置屏幕刷新率的demo,调用setDesiredDisplayConfigSpecs方法时该方法被hide,无法调用,如何解决和调用该方法呢

DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);

Display.Mode[] modes = display.getSupportedModes();
Display.Mode selectedMode = null;
for (Display.Mode mode : modes) {
    if (mode.getRefreshRate() == 120f) { // 设置 120Hz 刷新率
        selectedMode = mode;
        break;
    }
}

SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.setDesiredDisplayModeSpecs(display, selectedMode);

setDesiredDisplayConfigSpecs()方法是在Android 11中引入的,它用于设置显示器的高级配置,例如刷新率、分辨率等。调用该方法需要使用SurfaceControl类。

在调用setDesiredDisplayConfigSpecs()方法之前,您需要确保您的应用程序已经获得了对该权限的授予权限(android.permission.WRITE_SETTINGS)。

如果您正在使用API Level 30或更高版本,则可以通过以下方式调用该方法:

DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);

Display.Mode[] modes = display.getSupportedModes();
Display.Mode selectedMode = null;
for (Display.Mode mode : modes) {
    if (mode.getRefreshRate() == 120f) { // 设置 120Hz 刷新率
        selectedMode = mode;
        break;
    }
}

SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.setDesiredDisplayConfigSpecs(display, Collections.singletonList(new DisplayConfig.Builder(selectedMode).build()));
t.apply();

但是,需要注意的是,该方法是hide的,这意味着它不建议在生产环境中使用,因为它未经过完整的测试。如果您想要使用该方法,可以考虑使用反射来调用该方法,但这并不推荐。

另外,需要注意的是,由于setDesiredDisplayConfigSpecs()方法是hide的,因此在未来的版本中可能会被移除或更改其行为,因此建议您谨慎使用该方法。