如何在 Android TV 上读取真实的原生物理显示分辨率?

问题描述

我正在尝试读取我的 Android TV 设备上的真实物理显示分辨率。我有两台测试电视:

  • 1920 x 1080 分辨率的全高清
  • 3840 x 2160 分辨率的超高清

和 1 个 Android TV HDMI 棒,支持 Android 9。

我想根据电视设备读出真实的物理屏幕分辨率。为此,我尝试以两种方式读出 displayMetrics:

  1. 尝试:

     context.resources.displayMetrics
    
  2. 尝试:

      val displayMetrics = displayMetrics()
      activity.display?.getRealMetrics(displayMetrics)
    

不幸的是,我的超高清设备在上述两次尝试中都显示了 1920x1080。我对某些缩小的显示分辨率不感兴趣。

编辑:正如@IanGClifton 回答的那样,我用 displayCompat 试了一下。我有一个在 Andorid 9 上运行的 AndroidTV“Stick”,它通过 HDMI 连接到任何电视(插入上面提到的 3840x2160 像素的 UHD 电视)设备。我闪烁了 Stick,physicalWidthphysicalHeight 仍然告诉我 1920x1080 像素。

val defaultdisplay = activity.windowManager.defaultdisplay
val mode = displayCompat.getMode(context,defaultdisplay!!)
Log.d(TAG,"Resolution ${mode.physicalWidth} x ${mode.physicaHeigth}.")

但是,当我直接刷入 Android TV 设备(而不是 Android TV 棒)时,我得到了正确的分辨率。

如何读出任何设备的真实原生物理显示分辨率(以像素为单位)?

解决方法

Android TV 当前将 UI 映射到 1920x1080,然后根据附加面板进行缩放,因此您不想查看 DisplayMetrics 而是查看 DisplayCompat

使用 DisplayCompat.getSupportedModes() 获取可以告诉您分辨率的 ModeCompat 对象,但您需要确保您使用的是相对较新版本的 AndroidX Core,因为核心 1.5.0 中已修复-beta02 用于某些错误报告 1920x1080 的面板。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...