确定设备是否是平板电脑的最佳方法是什么?

tes*_*van 9 android android-layout

我需要编写一个方法来确定设备是平板电脑还是手机。我不需要根据此显示不同的用户界面。我只需要有关设备的信息,以便将来我可以将其发送到指标。

在网上,我找到了很多判断设备是否是平板电脑的方法。我已经测试了所有这些方法并且它们有效。当然,我无法在所有类型的设备上进行测试。所以我想知道确定设备是否是平板电脑的最佳且最准确的方法。

这是我能找到的方法的列表:

1) 使用最小宽度限定符

res/values-sw600dp/attrs.xml

<resources>
    <bool name="isTablet">true</bool>
</resources>
Run Code Online (Sandbox Code Playgroud)

res/values/attrs.xml

<resources>
    <bool name="isTablet">false</bool>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后:

fun isTablet() = context.resources.getBoolean(R.bool.isTablet)
Run Code Online (Sandbox Code Playgroud)

我对这种方式有顾虑。可能值得添加res/values-sw720dp/attrs.xml以下资源:

<resources>
        <bool name="isTablet">true</bool>
    </resources>
Run Code Online (Sandbox Code Playgroud)

2) 使用 TelephonyManager

  fun isTablet(context: Context) =
        with(context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager) {
            this.phoneType == TelephonyManager.PHONE_TYPE_NONE
        }
Run Code Online (Sandbox Code Playgroud)

3) 使用 Configuration

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

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
    }
Run Code Online (Sandbox Code Playgroud)

请帮助我找到 100% 有效的最佳方法。

Gab*_*han 6

这些在很大程度上是完全不同的事情。

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

方法2是说平板电脑是任何不能打电话的东西。

方法 3 检查其尺寸是否至少为 480x640 dp,或至少为 3 英寸 x 4 英寸。(可以小至 5 英寸对角线)。

方法4 精确测量对角线。这消除了方法 1 的一些理论问题,但它做了很多毫无意义的数学计算(而且这个实现没有优化)。

所有这一切都取决于您对平板电脑的定义。没有实际的定义。方法 1,3 和 4 是基于大小的。方法 2 的想法是,如果它具有通话功能,您就可以将其称为手机而不是平板电脑。

假设您想要一个基于尺寸的解决方案,我会选择 1。它比方法 3 更准确、更可扩展(无法区分小平板和大平板),并且比方法 4 更快(以及角点)。有些东西可以通过方法 1 但方法 4 捕获它们的情况在现实世界中确实不会发生)。