【问题标题】:Detecting 4K UHD screens on Android在 Android 上检测 4K 超高清屏幕
【发布时间】:2015-12-10 00:11:11
【问题描述】:

我正在尝试检测设备何时能够以 4K UHD (3840x2160) 分辨率输出。许多设备(例如 nVidia Shield TV 和 Sony Xperia Z5 Premium)将报告它们以 1080p 运行,即使它们能够支持 UHD,因为它们默认为非视频布局的 1080p 输出。我需要一些方法来检测它们是否具有 4K 能力,以区分它们和 Nexus Player 等非 4K 设备。

这是我用来确定当前分辨率的代码:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);

在 Shield TV 上,它始终返回 1920x1080,即使 ExoPlayer 报告它正在以 3840x2160 输出视频。

【问题讨论】:

  • 你试过这个stackoverflow.com/a/3166582/1944049 吗?
  • 在 Shield TV 上,该代码报告的密度为 xhdpi 和 320 dpi。它应该报告 xxxhdpi 和 640 dpi。
  • Sony X83C 的情况也一样......真的没有可靠的方法来检测 Android TV 上的 4K 吗?

标签: android android-tv


【解决方案1】:

更新:这已从 ExoPlayer 1.5.1 开始修复(请参阅 https://github.com/google/ExoPlayer/commit/79055066813123c939c29e5a5e223a5ff043b91e


我跟进了 ExoPlayer 的开发者并找到了答案:

可靠检测 4K 设备的唯一方法是使用 Device.Mode,它仅在 api 级别 23+ 中可用。请参阅此处的 Android M 说明:

https://developer.android.com/preview/api-overview.html#4K-display

这里的类文档:

https://developer.android.com/reference/android/view/Display.Mode.html#getPhysicalWidth()

至于ExoPlayer,它没有实现这个代码,从当前版本(1.4.2)开始,但这可能会改变。见:

https://github.com/google/ExoPlayer/issues/800

最后回答这个问题,现在检测 4K 的正确方法是这样的:

/**
 * Used to check if the connected device support UHD (3840x2160)
 *
 * Note that this call will fail to identify UHD devices on api level bellow 23 (M)
 *
 * @return 1 if device is UHD, 0 otherwise
 */
public int isUHD(){
    Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point displaySize = getDisplaySize(display);
    return (displaySize.x >= 3840 && displaySize.y >= 2160) ? 1 : 0;
}

/**
 * Convenience function that forks to the different ways to obatin the Display size across Android versions
 *
 * @param display Display instance to obtain information from
 *
 * @return Point a Point describing the Display size
 */
private static Point getDisplaySize(Display display) {
    Point displaySize = new Point();
    if(Util.SDK_INT >= 23){
        getDisplaySizeV23(display, displaySize);
    }else if(Util.SDK_INT >= 17) {
        getDisplaySizeV17(display, displaySize);
    } else if(Util.SDK_INT >= 16) {
        getDisplaySizeV16(display, displaySize);
    } else {
        getDisplaySizeV9(display, displaySize);
    }
    return displaySize;
}

@TargetApi(23)
private static void getDisplaySizeV23(Display display, Point outSize){
    Display.Mode[] modes = display.getSupportedModes();
    if(modes.length > 0){
        Display.Mode mode = modes[0];
        outSize.x = mode.getPhysicalWidth();
        outSize.y = mode.getPhysicalHeight();
    }
}

@TargetApi(17)
private static void getDisplaySizeV17(Display display, Point outSize) {
    display.getRealSize(outSize);
}

@TargetApi(16)
private static void getDisplaySizeV16(Display display, Point outSize) {
    display.getSize(outSize);
}

private static void getDisplaySizeV9(Display display, Point outSize) {
    outSize.x = display.getWidth();
    outSize.y = display.getHeight();
}

这将在 api 小于 23 时给出错误结果。

【讨论】:

  • 感谢您与 ExoPlayer 交谈。市场上的 Android TV 设备很少,所以我认为您可以放心地将任何 Android TV 设备默认为 4K,然后排除仅支持 1080p 的设备。我知道的唯一 1080p 设备是 Nexus Player 和 Razer Forge TV。
  • 我还没有研究过你所说的是否属实,但这样做的问题是即使你将它指定为源,ExoPlayer 也不会真正渲染 4K 流。这就是为什么该问题被报告为官方项目中的错误的原因。将会发生的事情(除非您覆盖错误的功能)是 ExoPlayer 会将其缩小到 1920。我希望这会很快改变。
  • 对于索尼电视,这个粘贴功能仍然不起作用。然而,链接的 ExoPlayer 提交中的一个有效 - 它对 Sony Bravia 有一个特殊的检测。
【解决方案2】:

应该使用 DisplayCompat.getSupportedModes,因为即使电视支持 UHD,它也可能以 FHD 运行。 UHD 可能仅在视频播放期间启用。

fun isUhdDevice(context: Context) : Boolean {

    val displayManager = DisplayManagerCompat.getInstance(context)
    val defaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY)

    defaultDisplay?.let { display ->
        return DisplayCompat.getSupportedModes(context, display).any { it.physicalHeight >= 2160 && it.physicalWidth >= 3840 }
    }
    return false
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多