59

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

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

编辑:

我在这个链接上找到了解决方案。

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

4

8 回答 8

133

用这个:

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

如果设备在大屏幕上运行,它将返回 true。

其他一些有用的方法可以在这里找到

于 2012-07-04T14:22:57.847 回答
26

您也可以尝试
在资源文件中 添加布尔参数。
在 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");
}
于 2015-12-14T07:27:39.177 回答
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;
    }
于 2013-09-11T12:16:37.420 回答
2

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

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;
}
于 2019-07-16T06:02:14.323 回答
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;
}
于 2016-09-14T15:05:06.753 回答
0

使用 Google Play 商店功能,并且只允许在平板电脑上下载您的平板电脑应用程序和在手机上下载手机应用程序。

如果用户随后安装了错误的应用程序,那么他们一定是使用另一种方法安装的。

于 2012-07-04T14:22:48.773 回答
0

我们的应用程序遇到了类似的问题,应该根据设备类型进行切换 - 选项卡/电话。IOS 完美地为我们提供了设备类型,但同样的想法不适用于 Android。分辨率/ DPI 方法因小分辨率标签、高分辨率手机而失败。经过大量的头发撕裂并将我们的头撞到墙上后,我们尝试了一个奇怪的想法,它工作得非常好,不取决于分辨率。这也应该对您有所帮助。

在 Main 类中,编写此代码,您应该将设备类型设置为 TAB 的 null 和 Phone 的 mobile。

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


if(ua.contains("Mobile")){
   //Your code for Mobile
}else{
   //Your code for TAB            
}
于 2014-06-03T13:30:07.277 回答
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;
}
于 2014-08-19T04:31:59.873 回答