Display.getSupportedModes() 在 4K Android TV 上仅返回 1080p 显示模式

Posted

技术标签:

【中文标题】Display.getSupportedModes() 在 4K Android TV 上仅返回 1080p 显示模式【英文标题】:Display.getSupportedModes() returns only 1080p display mode on 4K Android TV 【发布时间】:2018-11-27 23:59:51 【问题描述】:

我最近在我的应用中为 android TV 用户添加了对 4K 的支持。我的测试设备是 SONY KD-49XF9005。虽然内置的图像查看器和 YouTube 可以毫无问题地以 4K 显示,但到目前为止,我还没有让它在我的应用程序中运行。

我的应用使用 GLSurfaceView 来渲染图像。我关注了the 4K Display Mode API guide,并希望能够选择我的电视上可用的一种 4K 显示模式,以便我的 GLSurfaceView 可以以物理分辨率绘制(代码如下所示)。但是,API 不断地返回我一种且只有一种显示模式,即 1080p。这真的很困扰我,硬件应该支持它,因为其他内置应用程序可以使用 4K,为什么它不为我的应用程序返回 4K 显示模式?

我还阅读了所有相关的 Android TV 开发者指南,但没有发现任何特别之处。如果有人能让我对此有所了解,我将不胜感激。谢谢!

public static void select4kDisplayMode(Context context, Window window) 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) 
        return;
    

    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Display.Mode[] modes = display.getSupportedModes();
    if (modes == null) 
        return;
    

    Display.Mode selected = null;
    long max = 0;
    for (Display.Mode mode : modes) 
        FL.d(TAG, "available display mode: Mode %d: %dx%d/%.1ffps", mode.getModeId(),
                mode.getPhysicalWidth(), mode.getPhysicalHeight(),
                mode.getRefreshRate());
        long val = mode.getPhysicalWidth() * mode.getPhysicalHeight();
        if (val > max) 
            max = val;
            selected = mode;
        
    
    if (selected != null) 
        WindowManager.LayoutParams params = window.getAttributes();
        params.preferredDisplayModeId = selected.getModeId();
        window.setAttributes(params);

        FL.d(TAG, "selected display mode: Mode %d: %dx%d/%.1ffps", selected.getModeId(),
                selected.getPhysicalWidth(), selected.getPhysicalHeight(),
                selected.getRefreshRate());
    

【问题讨论】:

我建议您检查 ExoPlayer 的相关问题:github.com/google/ExoPlayer/issues/800 有提交在不同的 API 级别和设备上添加了 4k 检测 @MichaelSotnikov 谢谢,但我已经检查过了。我的理解是,如果你想显示 4K,你需要先通知操作系统你选择的显示模式,以便操作系统为你分配一个原始分辨率的 Surface。在该问题中跟踪的是我认为的第二步:当您要绘制高分辨率表面时,您需要能够选择匹配质量的内容。 @bosphere 我有同样的问题。我的结论是低成本的 ARM CPU SoC 只能管理 4K 视频,但可以处理全高清应用程序。我可以在手机和平​​板电脑中获得比全高清更多的东西,但在 android TV Xiaomi box S 和低成本 Amlogic S905X 设备中却没有…… 【参考方案1】:

我是中国的程序员,我发现Android TV只支持1080p分辨率的Android App。 我很困惑,我打印了电视的参数,你可以看到文档,它表明你可以在 Android 6.0 中使用 API 渲染 4K 视频,但本机应用程序仅支持电视中的 1080p。 这里:android 6.0 how supports 4K

【讨论】:

以上是关于Display.getSupportedModes() 在 4K Android TV 上仅返回 1080p 显示模式的主要内容,如果未能解决你的问题,请参考以下文章