如何确定设备是否为平板电脑?

8
我需要编写一个方法来确定设备是平板电脑还是手机。我不需要根据此显示不同的用户界面。我只需要关于设备的信息,以便将来可以将其发送到指标中。
在互联网上,我找到了许多确定设备是否为平板电脑的方法。我已经测试了所有这些方法,它们都有效。当然,我无法在所有类型的设备上进行测试。因此,我想知道确定设备是否为平板电脑的最佳和最准确的方法是什么。
以下是我能够找到的方法列表:
1) 使用最小宽度限定符
在 `res/values-sw600dp/attrs.xml` 中:
<resources>
    <bool name="isTablet">true</bool>
</resources>

res/values/attrs.xml
<resources>
    <bool name="isTablet">false</bool>
</resources>

然后:

fun isTablet() = context.resources.getBoolean(R.bool.isTablet)

我对这种方式感到担忧。或许值得添加一个资源 res/values-sw720dp/attrs.xml,其中包含:

<resources>
        <bool name="isTablet">true</bool>
    </resources>

2) 使用 TelephonyManager

  fun isTablet(context: Context) =
        with(context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager) {
            this.phoneType == TelephonyManager.PHONE_TYPE_NONE
        }

3) 使用 配置

fun isTablet(context: Context): Boolean {
    return ((context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE)
}

4) 使用 DisplayMetrics:

 fun isTablet(activity: Activity): Boolean {
        val metrics = DisplayMetrics()
        activity.windowManager.defaultDisplay.getMetrics(metrics)
        val yInches = metrics.heightPixels / metrics.ydpi
        val xInches = metrics.widthPixels / metrics.xdpi
        val diagonalInches = sqrt((xInches * xInches + yInches * yInches).toDouble())
        return diagonalInches >= 6.5
    }

请帮助我找到一种可以百分之百地工作的最佳方式。


1
“平板电脑”是一个营销术语,而不是技术术语。请问您对“平板电脑”的精确技术定义是什么? - CommonsWare
1
@CommonsWare, 600dp: 7英寸平板电脑 (600x1024 mdpi)。 720dp: 10英寸平板电脑 (720x1280 mdpi,800x1280 mdpi等)。 - testivanivan
1
这些都是分辨率。你认为一个屏幕为600dp的手机算不算平板电脑?你认为电视算不算平板电脑?你认为可折叠设备算不算平板电脑?你认为Chromebook上的窗口算不算平板电脑? - CommonsWare
@CommonsWare,这就是我想要理解的。我不太明白平板电脑在技术上是什么意思。“你认为电视是平板电脑吗?”- 不是。“你认为可折叠设备是平板电脑吗?”- 不是(我需要一个单独的检查来确定可折叠设备,但我仍然不太明白如何实现)。 “你认为Chromebook上的窗口是平板电脑吗?”- 不是。 - testivanivan
2
我不太明白平板电脑在技术上是什么意思,因为“平板电脑”不是一个技术术语,而是一个营销术语。如果有人要求你区分“手机”和“平板电脑”,那么他们需要更详细地解释这些术语的含义。只有在此之后,你才能尝试编写一些代码来满足他们的要求。 - CommonsWare
1个回答

6

在很大程度上,这些是完全不同的东西。

方法1是检查设备屏幕最小边的长度。基本上它是说平板电脑是任何在最小尺寸上超过4英寸的设备(在任何正常屏幕分辨率下至少为1英寸对角线)。

方法2是说任何不能拨打电话的设备都可以称之为平板电脑。

方法3检查其至少为480x640 dp或至少3英寸乘4英寸。 (这可以小到5英寸对角线)。

方法4是准确测量对角线。这消除了方法1中的一些理论问题,但进行了很多无意义的数学计算(而且此实现未经过优化)。

所有这些都取决于您对平板电脑的定义。没有实际的定义。方法1、3和4是基于尺寸的。方法2基于这样一个想法,即如果它有打电话的功能,您会将其称为手机而不是平板电脑。

假设您想要一个基于尺寸的解决方案,我会选择方法1。它比方法3更精确、更可扩展(不能告诉小型平板电脑和大型平板电脑),比方法4更快(在现实世界中,可能出现方法1可以通过但方法4能捕获它们的极端情况并不常见)。


谢谢您的回复。第一种和第四种方法是否也可以用来定义可折叠设备?不幸的是,我不太明白如何在技术上确定设备是否可折叠。 - testivanivan
@testivanivan 我认为你的做法是错误的。可折叠设备和平板电脑是相同的。折叠关闭后的设备和手机是相同的。不要担心我们称呼设备的方式,而是要关注在各种屏幕尺寸上提供良好的体验。通过正确响应调整大小事件来实现响应式设计。这样,您就不必担心设备类型、分屏模式、画中画或其他任何他们想出的东西了。 - Gabe Sechan
获取常见设备的屏幕尺寸列表,对每个尺寸进行测试,确保显示效果良好。考虑当屏幕尺寸增加时,更改布局是否会使其看起来更好或更易于使用。这就是你真正需要做的事情,"平板电脑"或"可折叠式"的精确定义并不重要。 - Gabe Sechan
对我来说,“平板电脑”或“可折叠设备”的定义非常重要,因为这是业务需求,我必须将设备信息发送到服务器以进行度量。不幸的是,这是一个要求,我需要履行它。 - testivanivan
@testivanivan 不,你需要反对那个要求。开发人员的工作不是盲目地填写需求,而是帮助确定需求的一部分。 - Gabe Sechan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接