确定设备是智能手机还是平板电脑?

时间:2012-02-14 14:58:33

标签: android device-detection

我想了解有关设备的信息,看看它是智能手机还是平板电脑。我该怎么做?

我想根据设备类型显示来自资源的不同网页:

String s="Debug-infos:";
s += "\n OS Version: " + System.getProperty("os.version") + "(" +    android.os.Build.VERSION.INCREMENTAL + ")";
s += "\n OS API Level: " + android.os.Build.VERSION.SDK;
s += "\n Device: " + android.os.Build.DEVICE;
s += "\n Model (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")";

但是,对我来说似乎没用。


此解决方案现在适用于我:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;

if (SharedCode.width > 1023 || SharedCode.height > 1023){
   //code for big screen (like tablet)
}else{
   //code for small screen (like smartphone)
}

9 个答案:

答案 0 :(得分:711)

Android培训中讨论了这个主题:

Use the Smallest-width Qualifier

如果您阅读整个主题,他们会解释如何在特定值文件中设置布尔值(如res / values-sw600dp / attr.xml):

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

因为sw600dp限定符仅对android 3.2以上的平台有效。如果您想确保此技术适用于所有平台(3.2之前),请在res / values-xlarge文件夹中创建相同的文件:

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

然后,在“标准”值文件中(作为res / values /),将布尔值设置为false:

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

然后在您的活动中,您可以获取此值并检查您是否在平板电脑尺寸设备中运行:

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
} else {
    // do something else
}

答案 1 :(得分:70)

我认为平板电脑至少有6.5英寸的屏幕。这是基于Nolf上面的答案计算它的方法。

DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

float yInches= metrics.heightPixels/metrics.ydpi;
float xInches= metrics.widthPixels/metrics.xdpi;
double diagonalInches = Math.sqrt(xInches*xInches + yInches*yInches);
if (diagonalInches>=6.5){
    // 6.5inch device or bigger
}else{
    // smaller device
}

答案 2 :(得分:38)

我的假设是,当您定义“移动/电话”时,您希望知道您是否可以在设备上拨打电话,但这些电话无法用于定义为“平板电脑”的内容。验证这一点的方法如下。如果你想知道基于传感器,屏幕尺寸等的东西,那么这实际上是一个不同的问题。

此外,虽然使用屏幕分辨率,或资源管理大与xlarge,可能是一个有效的方法在过去新的“移动”设备现在有这么大的屏幕和高分辨率,他们正在模糊这一行,而如果你真的希望知道电话与没有电话呼叫功能,以下是“最好的”。

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
            return "Tablet";
        }else{
            return "Mobile";
        }

答案 3 :(得分:28)

我喜欢Ol_v_er的解决方案而且它很简单但是,我发现它并不总是那么简单,新设备和显示器不断出现的东西,我想要更加“细化”,试图弄清楚实际屏幕尺寸。我发现John的另一个解决方案here使用String资源而不是布尔值来指定平板电脑大小。因此,不要只将true放在/res/values-sw600dp/screen.xml文件中(假设这是您的布局适用于小型平板电脑的位置),您可以使用:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="screen_type">7-inch-tablet</string>
</resources>

按如下方式引用它,然后根据结果执行您需要的操作:

String screenType = getResources().getString(R.string.screen_type);
if (screenType.equals("7-inch-tablet")) {
    // do something
} else {
    // do something else
}
Sean O'Toole对Detect 7 inch and 10 inch tablet programmatically的回答也是我所寻找的。如果这里的答案不允许您按照您的意愿具体说明,您可能需要检查一下。他在解释如何计算不同的指标以确定你实际处理的内容方面做得很好。

<强>更新

在查看Google I / O 2013应用源代码时,我遇到了以下用于识别设备是否是平板电脑的内容,因此我想我会添加它。上面的内容让你对它有了更多的“控制”,但是如果你只是想知道它是否是平板电脑,那么下面的内容非常简单:

public static boolean isTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK)
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

答案 4 :(得分:6)

由于平板电脑通常比智能手机大,并且由于低分辨率平板电脑可能具有与高分辨率智能手机相同的像素数,因此解决此问题的一种方法是计算设备的物理尺寸(不是分辨率): / p>

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    float yInches= metrics.heightPixels/metrics.ydpi;
    float xInches= metrics.widthPixels/metrics.xdpi;

   if (yInches> smallestTabletSize|| xInches > smallestTabletSize)
    {
                  //We are on a 
    }

答案 5 :(得分:6)

我发现的最佳选择和不太干扰的是在xml中设置标签参数,例如

PHONE XML LAYOUT

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="phone"/>

平板电脑XML布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="tablet">

    ...

</RelativeLayout>

然后在您的活动类中调用它:

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));

希望它适用于你。

答案 6 :(得分:5)

我在所有应用中使用此方法,并且成功运行:

public static boolean isTablet(Context ctx){    
    return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}

答案 7 :(得分:1)

我使用的解决方案是定义两个布局。一个布局文件夹设置为例如 布局sw600dp 我使用它为我的平板电脑用户提供一个菜单按钮,并为手机用户隐藏这个按钮。这样我就不必为我现有的应用程序实现ActionBar了......

请参阅this post for more details

答案 8 :(得分:1)

Re:关于如何从非电话告诉手机的切线:据我所知,只有手机有15位IMEI(国际移动台设备识别码),所以下面的代码将明确区分来自非电话的电话:

    TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    String deviceInfo = "";
    deviceInfo += manager.getDeviceId(); // the IMEI
    Log.d(TAG, "IMEI or unique ID is " + deviceInfo);

    if (manager.getDeviceId() == null) {
        Log.d(TAG, "This device is NOT a phone");
    } else {
        Log.d(TAG, "This device is a phone.");
    }

我发现在Nook模拟器上,getPhoneType()由于某种原因返回了一个“GSM”的phoneType,所以看来检查电话类型是不可靠的。同样,getNetworkType()将在飞行模式下为手机返回0。实际上,飞行模式将导致getLine1Number()和getSim *方法也返回null。但即使在飞机模式下,手机的IMEI仍然存在。