在 Android 上检测 4K UHD 屏幕

2024-02-22

我正在尝试检测设备何时能够以 4K UHD (3840x2160) 分辨率输出。 nVidia Shield TV 和 Sony Xperia Z5 Premium 等许多设备即使支持 UHD,也会报告以 1080p 运行,因为它们默认为非视频布局的 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 输出视频。


更新:从 ExoPlayer 1.5.1 开始,此问题已得到修复(请参阅https://github.com/google/ExoPlayer/commit/79055066813123c939c29e5a5e223a5ff043b91e 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/preview/api-overview.html#4K-display

该类的文档在这里:

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

As for ExoPlayer从当前版本(1.4.2)开始,它没有实现此代码,但这可能会改变。看:

https://github.com/google/ExoPlayer/issues/800 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 上给出错误的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 上检测 4K UHD 屏幕 的相关文章

  • Android 版 KSOAP2 提供

    我正在尝试访问 WSDL 位于的 Web 服务http srilanka lk 9080 services CropServiceProxy wsdl http srilanka lk 9080 services CropServicePr
  • 使用 GcmListenerService 的多个 GCM 侦听器

    Google 建议使用 GcmListenerService 代替 GcmBroadcastReceiver 我正在制作一个使用 GCM 的库项目 com android library 插件 当应用程序项目 com android app
  • 使用 SkiaSharp 在 Xamarin 中加载 SVG 文件

    从版本 1 55 0 开始 SkiaSharp 支持读取 SVG 文件 该软件包已于几天前发布 2016 年 11 月 10 日 但我找不到足够的有关如何使用它的文档 需要以下包 SkiaSharp 1 55 0 SkiaSharp 视图和
  • RecyclerView 上的删除按钮删除了错误的项目

    我正在使用 Firestore 适配器RecyclerView我在使用 删除 按钮时遇到问题 当我按下它时 它会删除错误的项目 而不是我想要的项目 这是我的按钮内部的代码onBindViewHolder protected void onB
  • 在 Cordova 中单击 html 按钮时启动新活动

    我正在尝试使用 Cordova 和 Java 构建 Android 应用程序 我想构建当在 HTML 代码中单击按钮时启动新 Intent 的意图 这是我的 HTML 代码 h2 Hello Android h2
  • 将 gradle-tool 更新到 3.1.0-beta3 或 3.2.0-alpha03 后出现新错误

    只是一个具有 prod 和 mock 风格的普通项目 在应用程序 build gradle中 sourceSets main java srcDirs blabla bla test java srcDirs blabla bla andr
  • 设备管理员禁用

    如果不是 则无法卸载设备管理应用程序 禁用 用户可以从设置中禁用 设备管理员 当公司向员工提供 Android 设备时 公司希望 可以控制设备及其状态和策略 但用户可以 轻松摆脱这种控制 有谁知道这怎么可能 防止用户禁用设备管理员 谢谢 无
  • 两个外部第三方混淆库中存在重复的类名

    我有一个项目 其中包含两个外部第三方库 当尝试构建项目时 这两个库的类文件名都被混淆了 并且 gradle barfs 了 Duplicate class a a a a a b found in modules 我无法排除任何类 因为它们
  • 我在 Android studio 中遇到错误

    在此输入图像描述 https i stack imgur com bvqID png我是安卓新手 我刚刚在 android studio 中创建了一个项目 并且在它的中遇到了问题manifest xml 错误是在 android icon
  • LineSpace 如何影响单行文本中的 StaticLayout 高度

    考虑这个简单的例子 我有这样的单行文本 你好 我想使用 StaticLayout 来测量这个文本 所以我写了这样的东西 StaticLayout layout new StaticLayout Hello myTextView getPai
  • DrawBitmapMesh 如何在 Android Canvas 中工作

    我想在矩形上绘制位图 我使用以下值 this meshWidth 1 this meshHeight 1 this verts new float 8 this points 0 x float this getWidth 4 this p
  • 如何使用 Eclipse 从我的设备检索我的应用程序的沙箱?

    我有一个 Android 应用程序 它使用共享首选项 我使用 Eclipse 在 Android 设备中运行该应用程序 我想拉整个sandbox来自设备到桌面这样我就可以手动查看sharedPreferences的内容 我点击了DDMS并点
  • 我在 Android Studio 中使用哪个版本的 JDK 有关系吗?

    I know I can choose the SDK location in Android Studio s Project Structure 我有两个问题 当我们已经使用Android SDK时 为什么还需要JDK 毕竟我们不是为
  • 活动丢失后终止异步任务

    这是我的过程和问题 在此应用程序中 您单击菜单按钮 在此菜单中 您按下切换按钮 该按钮将启动异步任务 每 30 秒发出一次提示音 该任务是在选中切换时持续运行 并在取消选中时取消 只要您留在菜单窗口中 就可以启动和停止该过程 检查切换框 如
  • 如何在 android 中的 facebook、whatapp、instagram 和其他平台上分享推荐代码

    我有一个屏幕 用户可以通过该屏幕在 Facebook WhatsApp Twitter 和 Instagram 上分享推荐代码 我已经有一个 API 来生成推荐代码 现在我正在浏览branch io 文档 但我能找到的只是深层链接 我无法理
  • 如何让更宽的图像在后台滚动

    就像 LinkedIn 中的前三个屏幕一样 Splash 登录 注册按钮 登录 注册表单 它们都具有相同的背景图像 但是当我们从一个活动移动到另一个活动时 背景图像从右滚动到左侧 我只能尝试overridePendingTransition
  • Android:需要记录麦克风输入

    有没有办法在实时播放 预览过程中记录 Android 中的麦克风输入 我尝试使用AudioRecord and AudioTrack这样做 但问题是我的设备无法播放录制的音频文件 实际上 任何Android播放器应用程序都无法播放录制的音频
  • 使用 Swift 在 iOS 和 Android 之间共享核心代码

    我想要的是 使用 Swift 在 Android 和 iOS 之间共享非 UI 代码 问题 Android 具有 NDK 支持 允许您使用 Java 本机接口 JNI 运行 C 和 C 代码 不是 Objective C 我是一名Java程
  • Android 调整图片大小

    我的图像存储在 SD 卡上 每个大小约为 4MB 我想调整每个的大小 而不是将其设置为 ImageView 但我不能使用BitmapFactory decodeFile path 因为异常 java lang OutOfMemoryErro
  • 如何禁用 Google 请求许可定期检查手机上已安装的应用程序?

    我正在开发一个 Android 应用程序 因此我不断地在我的测试设备上构建和安装该应用程序 几天以来 我在每次构建 安装时都会提出一个问题 Google 可能会定期检查已安装的应用程序是否存在潜在危害 行为 在 Google 设置 gt 验

随机推荐

  • 转义sql插入字符串的最佳方法?

    转义 sql 插入 更新字符串的最佳方法是什么 我想允许使用特殊字符 包括 和 在插入语句中使用每个字符串之前 搜索和替换每个字符串的最佳方法是吗 Thanks 重复 防御sql注入和跨站脚本的最佳方法 https stackoverflo
  • 如何在本地机器和minikube之间传输文件?

    我使用的是 Ubuntu 16 0 4 操作系统 并在其上安装了 minikube 我需要将一些文件复制到 minikube 那么我该怎么做呢 我尝试了下一个命令 但它询问我密码 但我不知道 scp media myuser sourceF
  • 如何安装特定版本的 H2O

    我需要安装旧版本的 H2O 因为即使版本只有一个 3 26 0 2 与 3 26 0 3 模型加载也不起作用 我正在努力寻找可以找到下载链接的页面 为什么它不存在 所有软件都有一个存档或旧版本页面 我还尝试使用当前版本的链接 但没有运气 因
  • 在网络浏览器中实现一个好的 redis 客户端需要什么?

    之前已经有人问过这个问题我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗 https stackoverflow com questions 5759120 can i connect directly to
  • 如何在 Flutter 中的 Scaffold.drawer 中保存 widget 的状态?

    我想保持小部件的状态Scaffold drawer The Scaffold drawer是一个自定义小部件 它有一个升起按钮在里面 当单击按钮时 按钮中的文本发生变化 但是 当抽屉关闭并重新打开抽屉时 更改的文本将被重置 我已经使用 与A
  • Graphviz --- 边标签距离另一条边太近

    我有以下代码 其结果如下图所示 正如您所看到的 边缘和边缘标签周围有点拥挤 尤其是 a 周围 创造更多空间的最佳方法是什么 以便人们可以清楚地看到哪个标签属于哪个边缘 digraph finite state machine pad 0 2
  • “存储”REST 原型如何不创建新资源和新 URI?

    REST API 设计表明有四种资源原型 文档 集合 存储和控制器 存储不创建新资源 因此 商店永远不会生成新的 URI 一个例子 PUT users 12245 favorites boston celtics 一位用户将波士顿凯尔特人队
  • Jersey 2.26 和 Spring 4.3.10,但没有 HK2

    是否可以将 Jersey 2 26 x 配置为仅依赖 Spring 进行注入而不是 HK2 我知道 Jersey 现在与 Spring 兼容 但是是否也可以完全摆脱 HK2 不 不是 Jersey 使用了 hk2 的许多特殊功能 例如与 S
  • R 中的广义降梯度 (GRG2) 算法

    有谁知道哪个R包实现了广义降低梯度 GRG2 算法 谢谢 由于 BenBolker 已经完成了初步的工作来寻找您希望复制的功能类型 因此我发布了一个可能有用的后续内容 最近 Rhelp 上的一次交流以 R 提名的报价结束fortunes包裹
  • Android Espresso - 单击带有图像和文本的导航抽屉项目

    当导航抽屉由带有图像和文本视图的行列表组成时 如何单击导航抽屉项目 我使用了来自以下位置的 Espresso 测试源示例 git testapp test src main java com google android apps comm
  • 更新本地通知的开火日期并取消之前的通知

    我知道有几个问题here https stackoverflow com questions 5866146 remove a local notification from iphone by date and there https s
  • 如何获取主机的主IP地址?

    调用以下命令会返回所有 IP 地址的列表 Dns GetHostAddresses Dns GetHostName 有时 根据机器配置 可能会给您返回多个 IP 那么问题来了 如何确定哪个是主IP地址呢 您是否枚举了 NIC 不存在 主 I
  • 我们在 PHP 的 cURL 中使用 CURLOPT_WRITEFUNCTION 有何用处?

    您能用例子描述一下吗 我知道这是一个老问题 但也许我的回答会对您或其他人有所帮助 WRITEFUNCTION 对于处理流入的文本或根据某些条件中止下载非常有用 这是一个简单地将所有文本转换为大写字母的示例 function get html
  • 通过限制性出站防火墙建立 TCP 连接

    我正在使用 Java 创建一个使用 TCP 进行通信的客户端 服务器应用程序 客户端运行的网络具有出站防火墙 可阻止客户端连接到服务器 有什么方法 解决方法可以通过此防火墙创建 TCP 连接吗 我尝试使用开放的常见端口 例如端口 80 44
  • 使用尾递归实现javascript函数

    我有一个代表树的平面数组 我想使用尾递归构建一个嵌套对象 我有以下代码可以运行并生成所需的输出 但我不确定它是否是尾递归的正确实现 请指教 const myArray id root id 0 parent root id 1 parent
  • NuGet Pack - 针对 nuspec 或 csproj 打包的不同问题

    我在这里遇到了第 22 条军规 我正在使用 NuGet 和 TeamCity 我试过做NuGet pack使用 nuspec 文件 我也尝试过使用 csproj 文件 每个人都有自己的问题 在 TeamCity 中 如果我使用nuspec文
  • 节点高速通道-会话管理

    我为 ArangoDB for ConnectJS 编写了一个会话存储驱动程序 它正在工作 尽管仍处于 alpha 阶段 但我有几个问题 过期属性为 false 的第一个会话仅在用户代理的持续时间内保留 我注意到浏览器窗口关闭时不会调用 s
  • 以编程方式获取 SQL 集群虚拟名称

    我编写了一个 Windows 服务来从我们所有的 SQL 服务器收集信息 该服务安装在每台服务器上 并利用 WMI 和 SMO 将相关系统信息插入回中央数据库 为了获取 SQL 信息 我使用以下 C 代码 List
  • 使用 EC2(Amazon Web Services)自动 Ejabberd 集群[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Using Ejabberd http www process one net en ejabberd in EC2 http aws amazon
  • 在 Android 上检测 4K UHD 屏幕

    我正在尝试检测设备何时能够以 4K UHD 3840x2160 分辨率输出 nVidia Shield TV 和 Sony Xperia Z5 Premium 等许多设备即使支持 UHD 也会报告以 1080p 运行 因为它们默认为非视频布