平板电脑或手机-Android

有没有一种方法可以检查用户使用的是平板电脑还是手机? 我的倾斜功能和我的新平板电脑(变压器)有问题

87931 次浏览

没有区别。您应该定义您认为的差异,并检查这一点。银河标签是手机吗?还是平板电脑?为什么?

您应该定义您正在寻找的特定特性,并为其编写代码。

看来你是在找“直到”。我认为这和加速度计是一样的(这是一个词吗?).你只需检查设备是否支持它,使用:

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/。我还没有测试它)

我认为这是最简单的方法,它可以检查屏幕的大小:

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

祝你好运!

请查看以下代码。

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

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

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英寸还是更小。

例如,手机和平板电脑之间有一个重要的区别(至少对我的程序而言)。它是设备的默认方向。手机有一个肖像方向,平板电脑的景观。以及分别确定装置的方法:

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

编辑: 在与 Dan Hulme 讨论之后,更改了该方法的名称。

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

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

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

/**
* 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;
}

当设备是平板电脑时,使用返回 没错的方法

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

我的假设是,当你定义“移动/电话”时,你希望知道你是否可以在设备上打电话,而不能在被定义为“平板电脑”的东西上打电话。验证这一点的方法如下。如果你想知道一些基于传感器、屏幕大小等的东西,那么这就是另外一个问题了。

此外,当使用屏幕分辨率,或者使用大对 xlarge 的资源管理时,在过去可能是一个有效的方法,新的“移动”设备现在带有如此大的屏幕和高分辨率,以至于它们模糊了这条界限,而如果你真的想知道电话呼叫与没有电话呼叫能力,以下是“最好的”。

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

我认为一个平板电脑有一个最小和最大600像素的宽度和高度,
所以需要知道屏幕密度和高度/宽度(dp),
检索值: < br >

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;

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

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
}

考虑到“新”接受的目录(值-sw600dp 为例) ,我创建了这个基于屏幕宽度 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;
}

在这个列表中,你可以找到一些流行设备和平板电脑尺寸的 DP:

Wdp/Hdp

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

宽度
高度

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

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

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

大多数时候,平板电脑和手机的区别在于屏幕尺寸,这就是为什么你要使用不同的布局文件。这些文件存储在 res/layout-<qualifiers>目录中。您可以为每个布局在 Directoyres/values-<same qualifiers>中创建一个 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/包含针对像 Nexus7这样的小型平板电脑的布局文件)

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


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

我知道这并不能直接回答你的问题,但是这里的其他答案给出了一个关于如何识别屏幕尺寸的好主意。你在你的问题中写道,你的倾斜有问题,这也发生在我身上。

如果你在智能手机上运行陀螺仪(或旋转传感器) ,根据设备的默认方向,x 轴和 y 轴的定义可能不同于平板电脑(例如,三星 GS2是默认画像,三星 GT-7310是默认画像,新的谷歌 Nexus 7是默认画像,尽管它是一台平板电脑.

现在,如果你想使用陀螺仪,你可能会得到一个智能手机的工作解决方案,但是轴-在一些平板电脑或其他方面的混乱。

如果您使用上面的解决方案之一,只是去屏幕大小,然后应用

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

如果它有一个大屏幕或 xlarge 屏幕大小的轴翻转这可能在90% 的情况下工作,但是例如在 Nexus 7会造成麻烦(因为它有默认的纵向和大屏幕大小)。

解决这个问题的最简单方法是在 RotationVectorSample 中提供的,该示例通过在您的清单中将画面定位设置为 nosensor来提供 API 演示:

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

对我来说最好的解决办法很简单:

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) {
[...]
}
}

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

运行良好的 Nexus7(大型)被检测为平板电脑,但不是 Galaxy S3(正常)。

我推荐安卓库“咖啡因”,包含获取手机或平板电脑,和10英寸 ~ !

非常容易使用。

图书馆在这里。

Https://github.com/shakej/android-caffeine-library

和使用

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

这个方法是谷歌推荐的,我在谷歌官方 Android 应用程序 iosched中看到了这段代码

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

这是我使用的方法:

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

使用:

配置 屏幕布局 _ 大小 _ 面具

配置 屏幕布局 _ 大小 _ 大

这是推荐的方法!

包管理器中的 com.sec.Feature. multiwindow.tablet 只针对平板电脑,而 com.sec.Feature. multiwindow.phone 只针对手机。

下面的方法是计算设备屏幕的对角线长度来判断设备是手机还是平板电脑。这种方法唯一需要考虑的是用什么阈值来决定设备是否是平板电脑。在下面的例子中,我设置为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的答案适用于我们测试过的所有设备,但不适用于 Mega 6.3。

上面的回答将 Mega 6.3作为一部手机返回——但是由于该设备仍然从 sw600dp 获取资源,它可能会导致其他问题——例如,如果你在手机而不是平板电脑上使用浏览器,那么你最终会出现 NPE 错误。

最后,似乎有太多的条件要检查,我们可能不得不接受一些手机实际上是平板电脑:-P

如果您的目标是 API 级别 > = 13,那么尝试一下

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

干杯: -)

如果屏幕大小检测没有在新设备上返回正确的值,那么尝试一下:

/*
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;}
}

在 Android4.2.2上测试(抱歉我的英语不好)

不需要代码

其他的答案列出了许多方法,通过编程来确定设备是手机还是平板电脑。但是,如果您阅读 文件,那就不是支持各种屏幕大小的推荐方法。

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

  • 对于 Android 3.2(API 级别13) ,添加一个 sw600dp文件夹。这意味着 <是的trong>是的最小的 什么idth 至少是600dp,这大约是手机/平板电脑的分水岭。但是,您也可以添加其他大小。有关如何添加其他布局资源文件的示例,请查看 这个答案

  • 如果你也支持前 Android 3.2设备,那么你需要添加 largexlarge文件夹来支持平板电脑。(电话一般是 smallnormal。)

下面是在为不同屏幕大小添加额外的 xml 文件之后,您的资源可能喜欢的内容的图像。

enter image description here

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

笔记

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

值得一读的 Android 文档

对我来说,手机和平板电脑的区别不在于设备的尺寸和/或像素密度(这将随着技术和口味的变化而变化) ,而在于屏幕比例。如果我正在显示一个文本屏幕,我需要知道,比如说,是否需要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;
}

在谷歌 IOSched2017应用程序 源代码中,使用了以下方法:

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

为什么要用这个?

Use this method which returns true when the device is a tablet


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

我在上面看到了很多方法。 Configuration 类在下面得到了正确的答案:

    /**
* Check if the Configuration's current {@link #screenLayout} is at
* least the given size.
*
* @param size The desired size, either {@link #SCREENLAYOUT_SIZE_SMALL},
* {@link #SCREENLAYOUT_SIZE_NORMAL}, {@link #SCREENLAYOUT_SIZE_LARGE}, or
* {@link #SCREENLAYOUT_SIZE_XLARGE}.
* @return Returns true if the current screen layout size is at least
* the given size.
*/
public boolean isLayoutSizeAtLeast(int size) {
int cur = screenLayout&SCREENLAYOUT_SIZE_MASK;
if (cur == SCREENLAYOUT_SIZE_UNDEFINED) return false;
return cur >= size;
}

打电话给:

 getResources().getConfiguration().
isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);

可以吗?

我只需要在布局文件中检测智能手机/平板电脑,因为我使用的是导航代码。

我首先做的是创建一个布局 -sw600dp 目录,但是它不能很好地工作,因为它会在横向模式下激活我的 Nokia 8,但是屏幕高度太小。

因此,我将目录重命名为 layout-sw600dp-h400dp,然后得到了预期的效果。H-xxxdp 参数应该取决于您希望在布局上删除多少内容,因此应该依赖于应用程序。