为 TV 开发的 App,你说要运行在手机上?

作者:网友投稿 时间:2018-02-04 09:23

字号

为 TV 开发的 App,你说要运行在手机上?

一、前言

Android 智能电视,不知道你接触过没有?近两年生产的电视,基本上都属于智能电视,而因为 Android 的开放性,这些电视很大一部分都是搭载的 Android 系统。

而除了 Android 智能电视之外,还有一些智能盒子,例如:小米盒子、天猫魔盒等,其实都是属于 Android 阵营的,接上一台显示器,就可以当一个智能电视使用。

在国内的环境下,开发 TV App 其实并没有遵循标准的 Google TV 的开发规范,而是把它当成一个普通的横屏 Android App 来开发。可是在这个过程中,是需要额外处理一些手机和电视的差异的,例如:焦点的控制、选中态的控制、屏幕的适配等等。

如果这些适配都已经做的非常好了的话,是可以在 Android 手机上,不需要做任何改动和配置,就完美的运行一个原本为 Android TV 而开发的 App 的。

而在某些场景下,你可能需要对你原本想为 TV 开发的 App,做一些手机上的适配,让它在运行在手机上的时候,呈现出另外的 UI 效果或者执行分支的逻辑。

举个比较实际的例子:简单的微信登录功能,TV App 来实现这个功能,一般是展示一个登录二维码,让用户通过手机扫码登录,但是如果这个 App 运行在手机上的话,你可能需要的是一个按钮,点击吊起微信去登录。

你别问为什么用户要在手机上安装一个 TV App?为什么不能让用户截图然后去微信里扫描截图登录?

需求下来了,就问你能不能实现?

那么,本文就来讨论一下,如何在运行时,通过一些标识来区分当前 App 是运行在手机上还是 TV 上。

二、如何区分

既然这是一个运行时的区分,肯定是需要获取一些设备上的差异值,来判定当前的运行环境。

那么首先提个问题给自己,手机和 TV 到底存在哪些差异?

手机和电视的差异性:

屏幕物理尺寸不同。

布局尺寸不同。

SIM 卡的支持不同。

电源接入的方式不同。

系统参数不同。

差不多就这些差异了,接下来我们进行详细分析。

1、屏幕物理尺寸

手机和电视的屏幕物理尺寸是完全不一样的,但是我们也不能完全使用买电视的时候介绍的 Xx寸 来区分屏幕物理尺寸。实际上完全可以将 Android TV 当成一个大号的平板。

这里以一个电视英寸数的计算公式,计算屏幕对角线的长度,来做一个参考的数值。

/** 

 * 检查当前屏幕的物理尺寸 

 * 小于 6.4 人为是手机,否则人为是电视 

 * 

 * @return true 手机,false TV 

 */ 

private static boolean checkScreenIsPhone(Context ctx) { 

    WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE); 

    Display display = wm.getDefaultDisplay(); 

    DisplayMetrics dm = new DisplayMetrics(); 

    display.getMetrics(dm); 

    double x = Math.pow(dm.widthPixels / dm.xdpi, 2); 

    double y = Math.pow(dm.heightPixels / dm.ydpi, 2); 

    // 屏幕尺寸 

    double screenInches = Math.sqrt(x + y); 

    return screenInches < 6.5; 

对于智能电视而言,我想最小应该都在 32 英寸,而这里的 6.4英寸以下,主要是基于手机的一个参数判断。

不过手机的屏幕尺寸越做越大,各大厂商现在也都在上线全面屏的产品,随手找了小米 Mix2 的参数,尺寸为 5.99 英寸,霸么就这个 6.4 英寸的判断条件,在现阶段来看是合理的。

2、布局尺寸

既然屏幕的尺寸有差异,那么从不同的布局中获取布局文件也是不一样的,可以通过 screenLayout 参数来区分出当前运行环境下命中那一套。

规则如下:

为 TV 开发的 App,你说要运行在手机上?

截图来自官方文档,有兴趣的可以通篇阅读一下。

https://developer.android.com/guide/practices/screens_support.html?hl=zh-cn

而代码如下:

/** 

 * 检查当前设备的局部尺寸 

 * 如果是 SIZE_LARGE 就人为是大屏幕的 

 */ 

private static boolean checkScreenLayoutIsPhone(Context ctx) { 

    return (ctx.getResources().getConfiguration().screenLayout 

            & Configuration.SCREENLAYOUT_LAYOUTDIR_MASK) 

            <= Configuration.SCREENLAYOUT_SIZE_LARGE; 

3、SIM 支持的模式

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
关键词 >>Android 手机 App
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接