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

use*_*635 251 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 + ")";
Run Code Online (Sandbox Code Playgroud)

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


这个解决方案现在适用于我:

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

ol_*_*_er 733

Android培训中讨论了此主题:

使用最小宽度限定符

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

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

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

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

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

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

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

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
} else {
    // do something else
}
Run Code Online (Sandbox Code Playgroud)

  • 精彩的回答;) (25认同)
  • @ user1938357注意"sw600dp"中的"dp",这意味着这不是与真实像素相比,而是与密度无关的像素.因此虽然S3有720px,但仍然低于600dp. (23认同)
  • WICKED ANSWER :) (21认同)
  • 这个答案很好但可能有点过时了,因为现在不推荐使用values-xlarge.使用/ res/values和/ res/values-sw600作为存储这些值的文件夹可能是更好的解决方案.sw600表示"最小宽度600".如果屏幕最小尺寸的大小大于或等于600dp,则将选择该文件夹中的值.值和布局存储桶(文件夹)的一个很好的参考是:http://android-developers.blogspot.com/2012/07/getting-your-app-ready-for-jelly-bean.html. (7认同)
  • 这可能不再有效,因为现在许多智能手机的最小宽度> 600,例如三星galaxy s3,其最小宽度为720像素,这得益于不断增加的像素密度. (7认同)
  • 正如@Sabo所说,与像素无关.我们正在与dp交谈.您可以将此视为可用空间来显示内容.平板电脑比手机有更多可用空间.独立于决议.sw600dp设备至少有600dp(7"屏幕).一个sw720dp至少有720dp(10"屏幕).像Nexus S这样的手机最小宽度为320dp,而Nexus 4,sw384和GS5则具有相同的宽度(sw360).所以这种技术也适用于现代全高清手机. (6认同)
  • 好答案!非常Brillant但在我的情况下,我开发一个库,我不能更改/添加任何文件/目录到项目 (2认同)
  • **values-large** 比 **values-xlarge** 更好。据我了解,旧的“large”相当于新的“sw600dp”。 (2认同)
  • 注意:将 isTablet 值包含在标准值文件中非常重要。如果不包含此内容,则在执行“booleantabletSize = getResources().getBoolean(R.bool.isTablet);”时将收到 ResourceNotFoundException。 (2认同)
  • dpi和像素不一样。正如@Sabo 上面所解释的,即使你有一个 1920x1080 像素的手机(如 S4 或 S5),它们的最小宽度也不会是 600dp。它将是 360dp(最小宽度 1080px,属于 xxhdpi x3 类别。因此 1080/3 = 360dp)。因此 sw600dp 将独立于实际像素分辨率工作。 (2认同)
  • 此方法不起作用,因为如果您在手机中处于“横向”模式时启动应用程序,则会传递 d600p,因此设备会认为它是平板电脑。 (2认同)
  • @MertSerimer 它有效,因为我使用 **sw**600dp。它表示X和Y的最小宽度。因此方向不会产生影响。在官方文档中:“由可用屏幕区域的最短尺寸指示”和“您可以使用此限定符来确保,无论屏幕的当前方向如何”http://developer.android.com/guide/practices/screens_support .html#NewQualifiers (2认同)

gts*_*ouk 78

我认为平板电脑至少有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
}
Run Code Online (Sandbox Code Playgroud)

  • 不为我工作。我为 10 英寸 Nexus 10 给出 4.89,为 5 英寸 Galaxy S2 给出 5.88。 (2认同)

Rob*_*III 40

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

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

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

  • 这种方法的问题在于某些电话设备可能具有大屏幕 (7认同)
  • 我只是尝试使用三星Tab 7并返回`PHONE_TYPE_GSM`.我猜是因为SIM卡模块初始化.所以绝对不可靠. (7认同)
  • 鉴于手机标签的涌入,我使用了两种解决方案的组合.True = tablet,false = not`TelephonyManager manager =(TelephonyManager)activity.getSystemService(Context.TELEPHONY_SERVICE);/*如果没有电话,那就是平板电脑.否则,chack boolean file*/boolean tablet = manager.getPhoneType()== TelephonyManager.PHONE_TYPE_NONE || .activity.getResources()getBoolean(R.bool.isTablet); ` (5认同)

Jas*_*son 30

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="screen_type">7-inch-tablet</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

参考如下,然后根据结果做你需要的:

String screenType = getResources().getString(R.string.screen_type);
if (screenType.equals("7-inch-tablet")) {
    // do something
} else {
    // do something else
}
Run Code Online (Sandbox Code Playgroud)

Sean O'Toole以编程方式检测7英寸和10英寸平板电脑的答案也是我一直在寻找的.如果这里的答案不允许您按照您的意愿具体说明,您可能需要检查一下.他在解释如何计算不同的指标以确定您实际处理的内容方面做得很好.

UPDATE

在查看Google I/O 2013应用程序源代码时,我遇到了以下用于识别设备是否是平板电脑的内容,因此我想我会添加它.上面给你一点"控制",但如果你只想知道它是否是平板电脑,下面的内容非常简单:

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


小智 7

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

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


Jor*_*sys 7

我在所有应用程序中都使用了这种方法,并且可以成功运行:

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


Ale*_*lez 6

我找到的最好的选项和不太干扰的是在你的xml中设置一个标签参数,比如

电话XML布局

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

平板电脑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>
Run Code Online (Sandbox Code Playgroud)

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

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));
Run Code Online (Sandbox Code Playgroud)

希望它对你有用.