平板电脑或手机 – Android

有没有办法检查用户是使用平板电脑还是电话? 我的倾斜function有问题,我的新平板电脑(变压器)

如前所述,您不想检查设备是平板电脑还是手机,但您想知道设备的function,

大多数情况下,平板电脑和手机的区别在于屏幕尺寸,这就是为什么您要使用不同的布局文件。 这些文件存储在res/layout-<qualifiers>目录中。 您可以在每个布局的directoy res/values-<same qualifiers>创build一个XML文件,并在其中放入一个int / bool / string资源来区分您使用的布局。

例:

文件res/values/screen.xml (假设res/layout/包含手机的布局文件)

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

文件res/values-sw600dp/screen.xml (假设res/layout-sw600dp/包含像Nexus 7这样的小型平板电脑的布局文件)

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

文件res/values-sw720dp/screen.xml (假设res/layout-sw720dp/包含Nexus 10等大型平板电脑的布局文件):

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

现在屏幕types可以通过R.string.screen_type常量访问。

要检测设备是否是平板电脑,请使用以下代码:

 public boolean isTablet(Context context) { boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE); boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE); return (xlarge || large); } 

大尺寸和XLARGE屏幕尺寸由制造商根据他们将要使用的眼睛的距离(因此是平板电脑的想法)来确定。

更多资讯: http : //groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f

这个职位帮了我很多,

不幸的是,我没有评估所有帮助我的答案的必要信誉。

我需要确定我的设备是平板电脑还是手机,这样我才能实现屏幕的逻辑。 在我的分析中,平板电脑必须以MDPI开始超过7英寸(Xlarge)。

下面的代码是基于这篇文章创build的。

 /** * Checks if the device is a tablet or a phone * * @param activityContext * The Activity Context. * @return Returns true if the device is a Tablet */ public static boolean isTabletDevice(Context activityContext) { // Verifies if the Generalized Size of the device is XLARGE to be // considered a Tablet boolean xlarge = ((activityContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE); // If XLarge, checks if the Generalized Density is at least MDPI // (160dpi) if (xlarge) { DisplayMetrics metrics = new DisplayMetrics(); Activity activity = (Activity) activityContext; activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); // MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160, // DENSITY_TV=213, DENSITY_XHIGH=320 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) { // Yes, this is a tablet! return true; } } // No, this is not a tablet! return false; } 

为什么不计算屏幕对angular线的大小,并使用它来决定设备是手机还是平板电脑?

 private boolean isTablet() { Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); int width = displayMetrics.widthPixels / displayMetrics.densityDpi; int height = displayMetrics.heightPixels / displayMetrics.densityDpi; double screenDiagonal = Math.sqrt( width * width + height * height ); return (screenDiagonal >= 9.0 ); } 

当然可以争论的是,门槛应该是9英寸还是更less。

没有区别。 你应该定义你认为的差异,并检查。 星系标签是一个电话吗? 或平板电脑? 为什么?

你应该定义你正在寻找什么特定的function,并为此编码。

看来你正在寻找“倾斜”。 我认为这是加速度计(这是一个字?)。 你可以检查设备是否支持它,使用:

 public class Accel extends Activity implements SensorListener { ... SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); boolean accelSupported = sensorMgr.registerListener(this, SENSOR_ACCELEROMETER, SENSOR_DELAY_UI); ... } 

(来自http://stuffthathappens.com/blog/2009/03/15/android-accelerometer/ 。我还没有testing过)

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

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

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

基于罗伯特戴尔约翰逊三世和赫尔顿伊萨克我想出了这个代码希望这是有用的

 public static boolean isTablet(Context context) { TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if (manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) { //Tablet return true; } else { //Mobile return false; } } public static boolean isTabletDevice(Context activityContext) { // Verifies if the Generalized Size of the device is XLARGE to be // considered a Tablet boolean xlarge = ((activityContext.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE); // If XLarge, checks if the Generalized Density is at least MDPI (160dpi) if (xlarge) { DisplayMetrics metrics = new DisplayMetrics(); Activity activity = (Activity) activityContext; activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); // MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160, // DENSITY_TV=213, DENSITY_XHIGH=320 if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT || metrics.densityDpi == DisplayMetrics.DENSITY_HIGH || metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM || metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) { // Yes, this is a tablet! return true; } } // No, this is not a tablet! return false; } 

所以在你的代码中做一个像

 if(isTabletDevice(Utilities.this) && isTablet(Utilities.this)){ //Tablet } else { //Phone } 

对于那些想要参考谷歌的代码来决定哪些设备将使用平板电脑的用户界面可以参考如下:

  // SystemUI (status bar) layout policy int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / DisplayMetrics.DENSITY_DEVICE; if (shortSizeDp < 600) { // 0-599dp: "phone" UI with a separate status & navigation bar mHasSystemNavBar = false; mNavigationBarCanMove = true; } else if (shortSizeDp < 720) { // 600-719dp: "phone" UI with modifications for larger screens mHasSystemNavBar = false; mNavigationBarCanMove = false; } else { // 720dp: "tablet" UI with a single combined status & navigation bar mHasSystemNavBar = true; mNavigationBarCanMove = false; } } 

这个方法是由Google推荐的。 我看到这个代码在谷歌官方Android应用程序iosched

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

思考“新”acecuts目录(值为sw600dp为例)我创build了这个方法基于屏幕的宽度DP:

  public static final int TABLET_MIN_DP_WEIGHT = 450; protected static boolean isSmartphoneOrTablet(Activity act){ DisplayMetrics metrics = new DisplayMetrics(); act.getWindowManager().getDefaultDisplay().getMetrics(metrics); int dpi = 0; if (metrics.widthPixels < metrics.heightPixels){ dpi = (int) (metrics.widthPixels / metrics.density); } else{ dpi = (int) (metrics.heightPixels / metrics.density); } if (dpi < TABLET_MIN_DP_WEIGHT) return true; else return false; } 

在这个列表中,你可以find一些stream行的设备和平板电脑的DP:

Wdp / Hdp

GALAXY Nexus:360/567
XOOM:1280/752
银河注意:400/615
NEXUS 7:961/528
GALAXY TAB(> 7 && <10):1280/752
GALAXY S3:360/615

Wdp =宽度dp
Hdp =高度dp

那么,为我工作的最佳解决scheme非常简单:

 private boolean isTabletDevice(Resources resources) { int screenLayout = resources.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; boolean isScreenLarge = (screenLayout == Configuration.SCREENLAYOUT_SIZE_LARGE); boolean isScreenXlarge = (screenLayout == Configuration.SCREENLAYOUT_SIZE_XLARGE); return (isScreenLarge || isScreenXlarge); } 

像这样使用:

 public void onCreate(Bundle savedInstanceState) { [...] if (this.isTabletDevice(this.getResources()) == true) { [...] } } 

我真的不想看像素大小,但只依赖于屏幕大小。

Nexus 7(LARGE)被检测为平板电脑,但不是Galaxy S3(NORMAL)。

当设备是平板电脑时,使用此方法返回true

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

如果屏幕尺寸检测在新设备上没有返回正确的值,请尝试:

 /* Returns '1' if device is a tablet or '0' if device is not a tablet. Returns '-1' if an error occured. May require READ_EXTERNAL_STORAGE permission. */ public static int isTablet() { try { InputStream ism = Runtime.getRuntime().exec("getprop ro.build.characteristics").getInputStream(); byte[] bts = new byte[1024]; ism.read(bts); ism.close(); boolean isTablet = new String(bts).toLowerCase().contains("tablet"); return isTablet ? 1 : 0; } catch (Throwable t) {t.printStackTrace(); return -1;} } 

testingAndroid 4.2.2(对不起,我的英文。)

没有需要的代码

其他答案列出了以编程方式确定设备是手机还是平板电脑的多种方式。 但是,如果您阅读文档 ,这不是支持各种屏幕尺寸的推荐方法。

相反,为平板电脑或手机申报不同的资源。 你这样做,我添加额外的资源文件夹的layoutvalues

  • 对于Android 3.2(API级别13),添加一个sw600dp文件夹。 这意味着最大宽度至less为600dp,大约是手机/平板电脑的差距。 不过,您也可以添加其他尺寸。 看看这个答案的例子,如何添加一个额外的布局资源文件。

  • 如果您还支持Android 3.2以前版本的设备,则需要添加largexlarge文件夹才能支持平板电脑。 (电话一般small normal 。)

这是一个你的资源可能会像为不同的屏幕尺寸添加额外的XML文件后的图像。

在这里输入图像描述

使用此方法时,系统会为您确定一切。 您不必担心在运行时使用哪个设备。 您只需提供适当的资源,让Android完成所有工作。

笔记

  • 您可以使用别名来避免重复相同的资源文件。

Android文档值得一读

  • 支持多个屏幕
  • 支持不同的屏幕尺寸
  • 分发到特定的屏幕

如果您只针对API级别> = 13,请尝试

 public static boolean isTablet(Context context) { return context.getResources().getConfiguration().smallestScreenWidthDp >= 600; } 

欢呼声:-)

我知道这不是直接回答你的问题,但在这里的其他答案给出了如何确定屏幕大小的好主意。 你在你的问题中写道,你有倾斜的问题,这也发生在我身上。

如果您在智能手机上运行陀螺仪(或旋转传感器),则根据该设备的默认方向,x轴和y轴可以不同于平板电脑上的定义(例如,Samsung GS2是默认的人像,Samsung GT-7310默认的风景,新的谷歌Nexus 7是默认的肖像,虽然它是一个平板!)。

现在,如果你想使用陀螺仪,你可能会得到一个针对智能手机的工作解决scheme,但是在某些平板电脑上或者相反的方向,会导致轴心混乱。

如果您使用上述解决scheme之一,只能使用屏幕尺寸,然后应用

 SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Y, outputRotationMatrix); 

如果它有一个很大的或xlarge的屏幕尺寸,这个轴可以在90%的情况下工作,但是例如在Nexus 7上会引起麻烦(因为它具有默认的纵向和大屏幕尺寸)。

通过在您的清单中将nosensor设置为nosensor,随API示例一起提供的RotationVectorSample中提供了解决此问题的最简单方法:

 <activity ... android:screenOrientation="nosensor"> ... </activity> 

包pipe理器中的com.sec.feature.multiwindow.tablet仅针对平板电脑,com.sec.feature.multiwindow.phone是针对手机的。

下面的方法是计算设备屏幕的对angular线长度来决定设备是手机还是平板电脑。 这个方法唯一的问题是判断设备是不是平板电脑的天气的阈值是多less。 在下面的例子中,我把它设置为7英寸及以上。

 public static boolean isTablet(Activity act) { Display display = act.getWindow().getWindowManager().getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); float width = displayMetrics.widthPixels / displayMetrics.xdpi; float height = displayMetrics.heightPixels / displayMetrics.ydpi; double screenDiagonal = Math.sqrt( width * width + height * height ); int inch = (int) (screenDiagonal + 0.5); Toast.makeText(act, "inch : "+ inch, Toast.LENGTH_LONG).show(); return (inch >= 7 ); } 
 public boolean isTablet() { int screenLayout = getResources().getConfiguration().screenLayout; return (Build.VERSION.SDK_INT >= 11 && (((screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) || ((screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE))); } 

在手机和平​​板电脑之间划线越来越困难。 例如(截至2015年8月), 三星Mega 6.3设备从sw600dp文件夹中获取资源,因此就Android而言,这是一款平板电脑。

@Vyshnavi的答案适用于我们testing过的所有设备,但不适用于Mega 6.3。

@Helton Isac上面的答案返回Mega 6.3作为手机 – 但由于该设备仍然从sw600dp获取资源,它可能会导致其他问题 – 例如,如果您使用viewpager手机,而不是平板电脑,你会结束与NPE错误。

最后,似乎有太多的条件可以检查,我们可能只需要接受一些手机实际上是片剂:-P

这是我使用的方法:

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

使用:

组态。 SCREENLAYOUT_SIZE_MASK

组态。 SCREENLAYOUT_SIZE_LARGE

这是推荐的方法!

对于我来说,手机和平板电脑之间的区别并不在于设备尺寸和/或像素密度,而是随着技术和品味而改变,而是屏幕比例。 如果我正在显示一个文本的屏幕,我需要知道是否需要15个长线(电话)对20个较短的线(平板电脑)。 对于我的游戏,我使用以下方法估算矩形,我的软件将处理:

  Rect surfaceRect = getHolder().getSurfaceFrame(); screenWidth = surfaceRect.width(); screenHeight = surfaceRect.height(); screenWidthF = (float) screenWidth; screenHeightF = (float) screenHeight; widthheightratio = screenWidthF/screenHeightF; if(widthheightratio>=1.5) { isTablet=false; }else { isTablet=true; } 

请检查下面的代码。

 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", int.class); boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con, 0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE return r; } catch (Exception x) { x.printStackTrace(); return false; } } return false; } 

我认为平板电脑的宽度和高度分别为600和600像素,
所以需要知道dp中的屏幕密度和高度/宽度,
检索值:

 DisplayMetrics metrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); float density = metrics.density; if((width/density>=600 && height/density>=600)) isTablette = true; else isTablette = false; 

例如,手机和平板电脑之间有一个重要的区别(至less对于我的程序)。 这是设备的默认方向。 手机有一个肖像取向,平板电脑 – 景观。 并分别确定设备的方法:

 private static boolean isLandscapeDefault(Display display) { Log.d(TAG, "isTablet()"); final int width = display.getWidth(); final int height = display.getHeight(); switch (display.getOrientation()) { case 0: case 2: if(width > height) return true; break; case 1: case 3: if(width < height) return true; break; } return false; } 

编辑:在与丹Hulme的讨论后改变了方法的名称。

我推荐android库'咖啡因'这包含手机或平板电脑,和10英寸〜!

非常容易使用。

图书馆在这里。

https://github.com/ShakeJ/Android-Caffeine-library

并使用

 DisplayUtil.isTablet(this); DisplayUtil.isTenInch(this); 

我认为这是诚实的最简单的方法。 这将检查正在使用的屏幕大小:

 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); 

祝你好运!