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

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

我想根据设备types从资源中显示不同的网页:

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 + ")"; 

但是,我的情况似乎没有用。


现在这个解决scheme适用于我:

 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) } 

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

http://developer.android.com/training/multiscreen/screensizes.html#TaskUseSWQuali

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

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

因为sw600dp限定符仅适用于Android 3.2以上的平台。 如果你想确保这个技术可以在所有平台上运行(在3.2之前),请在res / values-xlarge文件夹中创build相同的文件:

 <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 } 

我认为平板电脑至less有一个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 } 

我的假设是,当你定义“手机/手机”时,你想知道你是否可以在设备上打电话,这是不能做的东西,将被定义为“平板电脑”。 validation的方法如下。 如果你想知道基于传感器,屏幕尺寸等的东西,那么这是一个非常不同的问题。

此外,在使用屏幕分辨率,或资源pipe理大vs xlarge,可能是一个有效的方法在过去新的“移动”设备现在来这样的大屏幕和高分辨率,他们正在模糊这条线,而如果你真的想知道电话与没有电话通话能力下面是'最好的'。

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

我喜欢Ol_v_er的解决scheme,而且它很简单,但是我发现并不总是这么简单,新设备和显示器不断出现,我想在弄清楚实际的屏幕尺寸时多一些“精细” 。 我在这里find的另一个解决scheme是使用String资源而不是布尔值来指定平板电脑的大小。 因此,不要只是将/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 } 

肖恩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; } 

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

  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 } 

我发现的最好的select和较less的侵入性,就是在你的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"/> 

平板电脑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())); 

希望它适用于你。

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()由于某种原因返回一个phoneType“GSM”,所以它似乎检查手机types是不可靠的。 同样,在飞行模式下,getNetworkType()将返回0。 事实上,飞行模式将导致getLine1Number()和getSim *方法也返回null。 但即使在飞行模式下,手机的IMEI仍然存在。

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

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

我使用的解决scheme是定义两个布局。 一个与布局文件夹设置为例如layout-sw600dp我用它为我的平板电脑用户提供一个菜单button,并为电话用户隐藏。 这样我不(但)必须实施我的现有应用程序的ActionBar …

看到这个职位了解更多详情 。