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

标签 android android-layout tablet android-screen android-attributes

我需要编写一个方法来确定设备是平板电脑还是手机。我不需要根据这个显示不同的用户界面。我只需要有关设备的信息,以便将来我可以将其发送到指标。
在互联网上,我找到了很多方法来确定设备是否是平板电脑。我已经测试了所有这些方法并且它们有效。当然,我无法在各种设备上进行测试。所以我想知道确定设备是否是平板电脑的最佳和最准确的方法。
这是我能够找到的方法的列表:
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) 使用 Configuration :
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
    }
请帮助我找到 100% 有效的最佳方法。

最佳答案

在大多数情况下,这些是完全不同的事情。
方法 1 是检查设备屏幕最小边的长度。基本上它是说平板电脑在最小尺寸上超过 4 英寸(在任何正常的屏幕分辨率上都将至少为英寸诊断)。
方法 2 是说平板电脑是没有能力打电话的任何东西。
方法 3 正在检查其至少 480x640 dp,或至少 3 英寸 x 4 英寸。 (它可以像 5 英寸诊断仪一样小)。
方法4是精确测量诊断。这消除了方法 1 的一些理论问题,但它做了很多毫无意义的数学运算(而且这个实现没有优化)。
所有这一切都取决于您对平板电脑的定义。没有真正的定义。方法 1,3 和 4 是基于大小的。方法 2 的理念是,如果它能够打电话,你就会称它为手机而不是平板电脑。
假设您想要一个基于尺寸的解决方案,我会选择 1。方法 3(无法区分小平板电脑和大平板电脑)更准确、更可扩展,并且比方法 4(和角落)更快某些东西可以通过方法 1 但方法 4 捕获它们的情况在现实世界中确实不会发生)。

关于安卓。确定设备是否为平板电脑的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71374537/

相关文章:

javascript - Service Worker 未在移动版 Chrome 上注册

android - 使用 xml 菜单在抽屉导航中分隔

android - 如何设置 imageview 适合屏幕?

javascript - 简单的响应式图片方法

android - NDEF 兼容 NFC 芯片

android - 在Android中的 map View 上绘制一定半径的圆

android - 如何在电子商务应用程序中将 ListView 项目显示为项目?

android - 自定义 View 的主题样式

java - 我想破坏一个 swf ...然后 "uncorrupt"使其成为有效的 swf ...这可能吗?安卓Java

android - Google IO Sched 应用程序 - 平板电脑布局和 fragment