如何通过HDMI读取显示分辨率?DisplayCompat在安卓电视棒上不生效问题
Android TV 4K分辨率读取问题解答
问题背景
由于Android TV会对UHD/4K分辨率的电视设备的UI进行缩放,因此DisplayMetrics针对这类高分辨率设备始终返回1920x1080的数值。
其中一个常见的替代方案是使用DisplayCompat,但存在明显局限性:
在许多Android TV设备上,Display.Mode可能无法上报准确的宽高数值,原因是这类设备的图形管线性能不足以支撑其视频管线支持的分辨率下运行框架代码。对于这类设备,应用无法判断例如当前显示模式是否为4K,也无法确认显示设备是否支持切换到其他4K模式。
调用代码如下:DisplayCompat.getSupportedModes(context, display)
上述方法在搭载Android TV操作系统的4K一体电视设备上运行正常,可获取到真实的物理原生分辨率。但当使用同样搭载Android TV系统的安卓电视棒(例如Chromecast)时,相同函数却只会返回1920x1080的结果。
Android官方开发团队在代码提交注释中明确指出:
过去一年我们对该领域的Android TV架构有了更多了解,原有的设计存在缺陷。HDMI没有提供判定“原生”模式的方法,此外系统属性会根据当前显示模式动态变化。
如何通过HDMI读取屏幕分辨率?
HDMI规范本身没有提供直接读取显示设备原生分辨率的标准接口,不存在跨设备通用的直接读取方案,可根据使用场景选择以下替代方案:
- 针对Android 11及以上系统设备:优先通过
Display.getMode()接口获取视频输出管线的当前模式参数,该参数返回的是实际HDMI输出的分辨率,而非UI缩放后的渲染分辨率 - 针对低版本系统/电视棒类设备:尝试读取系统属性
sys.display-size,绝大多数厂商会将当前HDMI输出的最大支持分辨率写入该属性,需要注意该属性会随输出模式动态变化,无法直接获取物理屏幕的原生固定分辨率 - 针对媒体播放场景:可通过
MediaCodecList查询设备支持的最大视频解码分辨率间接判断,4K设备普遍支持HEVC 4K解码,1080p设备通常最高仅支持1080p解码,该方法为间接判断,准确率约90%以上
缺陷修复进度说明
目前Android官方尚未公布该问题的通用修复计划,核心限制在于:
- HDMI规范无原生分辨率判定标准,无法通过统一接口从显示端获取固定参数
- 不同厂商的电视/电视棒硬件架构差异极大,图形管线和视频管线分离的设计没有统一实现标准,无法做全设备适配
现有第三方修复方案均为特定设备的定制修改,没有适用于所有Android TV设备的通用补丁。
内容的提问来源于stack exchange,提问作者Murat
相关产品推荐
相关产品推荐

