区分App运行在手机还是电视,就是要稳

4,254

版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

未经允许,不得转载。

一、前言

现在 Android 智能电视出货量已经非常的大了,近两年产的电视,基本上都属于智能电视,而很大一部分都是搭载的 Android 系统。

当然,除了智能电视之外,还有一些智能盒子,例如:小米盒子、天猫魔盒等,其实最终都是 Android 系统。

在国内的环境下,开发的 TV App 其实也并不是遵循的 Google TV 的开发规范,而都是当成一个普通的 Android App 来开发的。在这个过程中,实际上是需要处理一些手机和电视的差异的,例如:焦点、选中状态、屏幕适配等等,这些有时间再细说。

如果,屏幕适配做的好的话,实际上是可以无缝在手机设备上,运行一个原本为了 Android TV 而开发的 App。

而有些场景下,为了节约开发成本,有可能需要对一些在电视上运行的 App 做一个手机端的适配,最常见的场景,一个微信登录的功能,TV App 做的一般是提供一个二维码,让手机扫码登录,但是当这个程序运行在手机端的时候,就可能需要一个按钮,点击调起微信去登录了。

那么,如何在同一个 App 内,区分当前运行在手机设备上,还是电视设备上,就尤为重要了。

二、如何区分

既然要对运行环境做一个区分,那么就需要考虑到,手机和电视的一些差异。

手机和电视的差异性:

  • 屏幕物理尺寸不同。
  • 布局尺寸不同。
  • SIM 卡的状态不同。
  • 电源接入的方式不同。

1、屏幕物理尺寸

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

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


既然把电视当成一个大平板,这里计算出来的数值,对于电视而言,基本上都是大于 6.5 的,所以以这个条件做判断,是有一定参考价值的。

2、布局尺寸

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

规则如下:

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

developer.android.com/guide/pract…

而代码如下:

3、SIM 支持的模式

对于电视而言,就现在所了解到的,还没有一款智能电视或者智能盒子,是可以插 SIM 卡的,所以判断 SIM 支持的模式,基本上就可以区分出电视还是手机了。

SIM 卡支持的模式可以使用 TelephonyManager 来获取当前的状态。


可以看到 getPhoneType() 可以获取当前设备支持的 Radio 的模式。


一般而言,判断不出来,就可以人为是一款不支持 SIM 插卡的设备了。

4、电源的接入方式

对于电视的电源,有什么特点?

  1. 永远没有耗电的变动,获取到的电量永远是满的。
  2. 电源接入的方式,使用 AC 交流电,而非 USB 或者电池。

获取当前电源和充电的接入方式,没什么好说的,基本上依据这两个条件,就可以区分出当前到底是电视还是手机/平板了。

三、设计原则

这里提供的几点方法,其实都是猜测,都是有缺陷的。例如可能出现某些厂商的奇葩设备,出货屏幕尺寸就是大的手机,或者有一些奇葩的电视或者盒子,就是可以支持插 SIM 卡,再或者有其实还有一些智能投影的设备,其实是内带电池的,是有电量的消耗的。

所以最稳妥的方式,就是组合起来判断。


而这里实际上,这款 App 依然是主要需要发布Android 电视市场的,所以这里的判断,对手机进行严格判断,其他的都认为是 Android TV 。这样即便是误判了,影响也不会太大。

公众号二维码.jpg