以编程方式更改主显示分辨率

anr*_*r78 5 android android-windowmanager surfaceflinger android-displaymanager

我正在尝试更改 Android 8.1 上主显示器的显示分辨率。我从内核收到一个事件(基于 EDID),告诉我需要更改模式。

然后我基本上做:

sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
status_t res = SurfaceComposerClient::setActiveConfig(display, new_mode);
Run Code Online (Sandbox Code Playgroud)

这会正确更新 SurfaceFlinger、显示 hal 和内核,但 windowmanager/display 不会更改分辨率,直到我运行:

wm size 1920x1080
wm density 240
Run Code Online (Sandbox Code Playgroud)

但是 wm 调用这些函数,这看起来有点太苛刻了,并且还将尺寸/密度存储在持久设置中:

public void setForcedDisplaySize(int displayId, int width, int height);
public void setForcedDisplayDensityForUser(int displayId, int density, int userId);
Run Code Online (Sandbox Code Playgroud)

我一直在查看 windowmanager/display 中的代码,但没有找到我应该用于此目的的 API。

有没有办法通知 windowmanager/display 有关 surfaceflinger 的更改,或者我错过了可以使用的 API?

我是否以错误的方式处理这个问题?有没有一种正确的方法可以改变主显示器的分辨率/模式,但我还没有找到?