如何检测设备是Android手机还是Android平板电脑?

时间:2012-07-04 13:46:36

标签: android device-detection

我有两款适用于Android平板电脑和Android手机的应用。对于平板电脑应用,我设置了android:minSdkVersion="11"。但是现在像Galaxy S3这样的Android手机拥有Android 4.0.4版本,因此S3用户可以从Google Play商店下载我的平板电脑应用程序。我想警告手机用户在安装平板电脑应用程序时下载手机应用程序。反之亦然,平板电脑用户在运行手机应用程序时下载平板电脑应用程序。

有没有简单的方法来检测设备类型?

编辑:

我在link找到了解决方案。

在您的清单文件中,您可以为手机和平板电脑声明屏幕功能,然后Google Play会决定手机和平板电脑的下载权限。

8 个答案:

答案 0 :(得分:129)

使用此:

public static boolean isTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK)
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
如果设备在大屏幕上运行,

将返回true。

Some other helpful methods can be found here

答案 1 :(得分:20)

你也可以尝试这个
在资源文件中添加布尔参数 在res / values / dimen.xml文件中添加此行

<bool name="isTab">false</bool>

在res / values-sw600dp / dimen.xml文件中添加以下行:

<bool name="isTab">true</bool>

然后在你的java文件中获取这个值:

if(getResources().getBoolean(R.bool.isTab)) {
    System.out.println("tablet");
} else {
    System.out.println("mobile");
}

答案 2 :(得分:7)

此代码段将告知设备类型是否为7英寸或更高以及Mdpi或更高分辨率。您可以根据需要更改实施。

 private static boolean isTabletDevice(Context activityContext) {
        boolean device_large = ((activityContext.getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK) ==
                Configuration.SCREENLAYOUT_SIZE_LARGE);

        if (device_large) {
            DisplayMetrics metrics = new DisplayMetrics();
            Activity activity = (Activity) activityContext;
            activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

            if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT
                    || metrics.densityDpi == DisplayMetrics.DENSITY_HIGH
                    || metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM
                    || metrics.densityDpi == DisplayMetrics.DENSITY_TV
                    || metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {
                AppInstance.getLogger().logD("DeviceHelper","IsTabletDevice-True");
                return true;
            }
        }
        AppInstance.getLogger().logD("DeviceHelper","IsTabletDevice-False");
        return false;
    }

答案 3 :(得分:0)

使用Google Play商店功能,只能在平板电脑和手机上的手机应用下载平板电脑应用。

如果用户然后安装了错误的应用程序,那么他们必须使用其他方法安装。

答案 4 :(得分:0)

我们的应用程序存在类似的问题,应根据设备类型切换 - 标签/电话。 IOS完美地为我们提供了设备类型,但同样的想法并没有使用Android。分辨率/ DPI方法失败,小res选项卡,高分辨率手机。在经过大量撕裂的毛发并将我们的头撞在墙上之后,我们尝试了一个奇怪的想法,并且效果非常好,不依赖于分辨率。这对你也有帮助。

在Main类中,写下这个,你应该将你的设备类型设为null,TAB和mobile for Phone。

String ua=new WebView(this).getSettings().getUserAgentString();


if(ua.contains("Mobile")){
   //Your code for Mobile
}else{
   //Your code for TAB            
}

答案 5 :(得分:0)

使用以下代码识别设备类型。

private boolean isTabletDevice() {
     if (android.os.Build.VERSION.SDK_INT >= 11) { // honeycomb
         // test screen size, use reflection because isLayoutSizeAtLeast is only available since 11
         Configuration con = getResources().getConfiguration();
         try {
              Method mIsLayoutSizeAtLeast = con.getClass().getMethod("isLayoutSizeAtLeast");
              Boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con, 0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE
              return r;
         } catch (Exception x) {
              return false;
         }
      }
    return false;
}

答案 6 :(得分:0)

如果您要根据屏幕英寸来确定设备是平板电脑还是手机, 您可以使用以下

6.5英寸或更高的

设备被视为平板电脑,但是最近的一些手持电话的对角线值更高。好的解决方案,您可以设置边距。

public boolean isDeviceTablet(){
    DisplayMetrics metrics = new DisplayMetrics();
    this.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) {
        return true;
    }
    return false;
}

答案 7 :(得分:-1)

我认为这应该可以检测到某些内容是否可以拨打电话,其他所有内容都是没有电话功能的平板电脑/电视。

据我所知,这是唯一不依赖屏幕化的东西。

public static boolean isTelephone(){
    //pseudocode, don't have the copy and paste here right know and can't remember every line
    return new Intent(ACTION_DIAL).resolveActivity() != null;
}