以编程方式检测7英寸和10英寸平板电脑

时间:2013-02-24 19:08:08

标签: android android-layout screen

有没有办法以编程方式查找应用程序所安装的设备是7英寸平板电脑还是10英寸平板电脑?

13 个答案:

答案 0 :(得分:228)

您可以使用DisplayMetrics获取有关运行您的应用的屏幕的大量信息。

首先,我们创建一个DisplayMetrics指标对象:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

由此,我们可以获得尺寸显示所需的信息:

int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;

这将返回宽度和高度的绝对值(以像素为单位),因此Galaxy SIII,Galaxy Nexus等为1280x720。

这通常不会有帮助,因为当我们处理Android设备时,我们通常更喜欢使用与密度无关的像素,dip。

您再次使用density以设备的比例因子的形式获得metrics屏幕,该比例因子基于mdpi hdpifloat scaleFactor = metrics.density; DPI scales

float widthDp = widthPixels / scaleFactor
float heightDp = heightPixels / scaleFactor

从这个结果中,我们可以计算出一定高度或宽度的密度独立像素的数量。

min

您从中获得的结果将帮助您确定与Android Design Resources一起使用的屏幕类型,它为您提供每种屏幕尺寸的相对dp:

  
      
  • 320dp:典型的手机屏幕(240x320 ldpi,320x480 mdpi,480x800 hdpi等)。
  •   
  • 480dp:像Streak(480x800 mdpi)这样的tweener平板电脑。
  •   
  • 600dp:7“片剂(600x1024 mdpi)。
  •   
  • 720dp:10英寸平板电脑(720x1280 mdpi,800x1280 mdpi等)。
  •   

使用上述信息,我们知道如果设备的最小宽度大于600dp,则该设备为7“平板电脑,如果它大于720dp,则设备为10”平板电脑。

我们可以使用Math类的heightDp函数计算最小宽度,传入widthDpsmallestWidth以返回float smallestWidth = Math.min(widthDp, heightDp); if (smallestWidth > 720) { //Device is a 10" tablet } else if (smallestWidth > 600) { //Device is a 7" tablet }

metrics

然而,这并不总能给你一个完全匹配,特别是当使用晦涩的平板电脑时可能会将其密度误认为hdpi,如果不是,或者可能只有800 x 480像素但仍然在7“屏幕。

除了这些方法之外,如果您需要知道设备的确切尺寸(以英寸为单位),您也可以使用float widthDpi = metrics.xdpi; float heightDpi = metrics.ydpi; 方法计算每英寸屏幕的像素数。

float widthInches = widthPixels / widthDpi;
float heightInches = heightPixels / heightDpi;

您可以使用每英寸设备中有多少像素的知识以及总计像素数来计算设备的英寸数。

//a² + b² = c²

//The size of the diagonal in inches is equal to the square root of the height in inches squared plus the width in inches squared.
double diagonalInches = Math.sqrt(
    (widthInches * widthInches) 
    + (heightInches * heightInches));

这将以英寸为单位返回设备的高度和宽度。这对于确定它是什么类型的设备并不总是有用的,因为设备的广告尺寸是对角线,我们所拥有的只是高度和宽度。

然而,我们也知道,考虑到三角形的高度和宽度,我们可以使用毕达哥拉斯定理来计算斜边的长度(在这种情况下,屏幕对角线的大小)。

if (diagonalInches >= 10) {
    //Device is a 10" tablet
} 
else if (diagonalInches >= 7) {
    //Device is a 7" tablet
}

由此,我们可以确定该设备是否是平板电脑:

{{1}}

这就是你如何计算你正在使用的设备类型。

答案 1 :(得分:32)

没有任何内容可以说7"10" AFAIK。在解码位图和诸如此类的东西时,系统使用的屏幕尺寸大致有两种方式。它们都可以在Context中找到的应用程序的Resources对象中找到。

第一个是Configuration对象,可以通过getContext().getResources().getConfiguration()获得。你有:

Configuration#densityDpi - 呈现的目标屏幕密度,对应于密度资源限定符。

Configuration#screenHeightDp - 可用屏幕空间的当前高度,以dp为单位,对应于屏幕高度资源限定符。

Configuration#screenWidthDp - 可用屏幕空间的当前宽度,以dp为单位,对应于屏幕宽度资源限定符。

Configuration#smallestScreenWidthDp - 应用程序在正常操作中将看到的最小屏幕尺寸,对应于最小屏幕宽度资源限定符。

有了这个,您几乎可以使用屏幕指南来确定您的设备是否来自相应的专用资源文件夹(hdpixhdpilarge,{{1等等。)。

请记住,这些是一些存储桶:

  • xlarge屏幕至少为960dp x 720dp
  • 大屏幕至少为640dp x 480dp
  • 正常屏幕至少为470dp x 320dp
  • 小屏幕至少为426dp x 320dp

  • 320dp:典型的手机屏幕(240x320 ldpi,320x480 mdpi,480x800 hdpi等)。

  • 480dp:像Streak(480x800 mdpi)这样的tweener平板电脑。
  • 600dp:7“片剂(600x1024 mdpi)。
  • 720dp:10英寸平板电脑(720x1280 mdpi,800x1280 mdpi等)。

More info

第二个是xlarge获得的DisplayMetrics对象。你有:

getContext().getResources().getDisplayMetrics() - 显示的逻辑密度。

DisplayMetrics#density - 屏幕密度以每英寸点数表示。

DisplayMetrics#densityDpi - 显示的绝对高度,以像素为单位。

DisplayMetrics#heightPixels - 显示的绝对宽度,以像素为单位。

DisplayMetrics#widthPixels - X维度中每英寸屏幕的确切物理像素数。

DisplayMetrics#xdpi - Y维度中每英寸屏幕的确切物理像素数。

如果你需要精确的屏幕像素数而不是密度,这很方便。但是,重要的是要注意屏幕的像素全部。不只是你可以使用的那些。

答案 2 :(得分:13)

将此方法放在onResume()中并可以检查。

public double tabletSize() {

     double size = 0;
        try {

            // Compute screen size

            DisplayMetrics dm = context.getResources().getDisplayMetrics();

            float screenWidth  = dm.widthPixels / dm.xdpi;

            float screenHeight = dm.heightPixels / dm.ydpi;

            size = Math.sqrt(Math.pow(screenWidth, 2) +

                                 Math.pow(screenHeight, 2));

        } catch(Throwable t) {

        }

        return size;

    }

一般在6英寸大小后开始使用平板电脑。

答案 3 :(得分:8)

切换纵向与横向时,上述操作并不总是有效。

如果您的目标是API级别13+,如上所述很容易 - 使用Configuration.smallestScreenWidthDp,然后进行相应测试:

resources.getConfiguration().smallestScreenWidthDp

否则,如果您能负担得起,请使用以下方法,这是一种非常准确的方法,通过让系统告诉您来检测600dp(如6“)与720dp(如10”):

1)添加到layout-sw600dp和layout-sw720dp(如果适用,还有其横向)一个具有正确ID的不可见视图,例如:

对于720,在layout-sw720dp上:

<View android:id="@+id/sw720" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>

对于600,在layout-sw600dp:

<View android:id="@+id/sw600" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>

2)然后在代码上,例如,Activity,相应地进行测试:

private void showFragment() {
    View v600 = (View) findViewById(R.id.sw600);
    View v720 = (View) findViewById(R.id.sw720);
    if (v600 != null || v720 !=null)
        albumFrag = AlbumGridViewFragment.newInstance(albumRefresh);
    else
        albumFrag = AlbumListViewFragment.newInstance(albumRefresh);
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.view_container, albumFrag)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
        .commit();
}

答案 4 :(得分:7)

很棒的信息,正是我所寻找的!但是,在尝试了这一点之后,我发现当使用此处提到的指标时,Nexus 7(2012模型)报告的尺寸为1280x736。我还有一台运行Jelly Bean的摩托罗拉Xoom,它错误地报告了1280x752的分辨率。我偶然发现这篇帖子here证实了这一点。基本上,在ICS / JB中,使用上述指标的计算似乎排除了导航栏的尺寸。还有一些研究让我Frank Nguyen's answer here使用不同的方法来提供屏幕的原始(或实际)像素尺寸。我的初步测试显示,Frank correclty的以下代码报告了Nexus 7(2012款运行JB)和运行JB的Motorola Xoom的尺寸:

int width = 0, height = 0;
final DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = null, mGetRawW = null;

try {
    // For JellyBeans and onward
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
        display.getRealMetrics(metrics);

        width = metrics.widthPixels;
        height = metrics.heightPixels;
    } else {
        mGetRawH = Display.class.getMethod("getRawHeight");
        mGetRawW = Display.class.getMethod("getRawWidth");

        try {
            width = (Integer) mGetRawW.invoke(display);
            height = (Integer) mGetRawH.invoke(display);
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
} catch (NoSuchMethodException e3) {
    e3.printStackTrace();
}

答案 5 :(得分:3)

我有两个分辨率相同的Android设备

Device1 - &gt;分辨率480x800对角线屏幕尺寸 - &gt; 4.7英寸

Device2 - &gt;分辨率480x800对角线屏幕尺寸 - &gt; 4.0英寸

它给出设备对角线屏幕尺寸 - &gt; 5.8

问题的解决方案是......

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width=dm.widthPixels;
int height=dm.heightPixels;
int dens=dm.densityDpi;
double wi=(double)width/(double)dens;
double hi=(double)height/(double)dens;
double x = Math.pow(wi,2);
double y = Math.pow(hi,2);
double screenInches = Math.sqrt(x+y);

请参阅details here ..

答案 6 :(得分:2)

Android指定screen sizes的方式是通过四种通用尺寸:正常 xlarge

虽然Android documentation声明不推荐使用尺寸组

  

...不推荐使用这些尺寸组,而采用新技术来管理基于屏幕尺寸的屏幕尺寸   可用的屏幕宽度。如果你正在为Android 3.2和Android开发   更多,请参阅[为Android 3.2声明平板电脑布局](   hdpi(高)~240dpi)更多   信息。

通常,尺寸限定符 large 指定7&#34;片剂。 xlarge 的大小限定符指定10&#34;片剂:

enter image description here

触发大小限定符的好处是,您可以保证您的资产和代码在使用哪个资产或激活代码路径方面达成一致。

要在代码中检索大小限定符,请进行以下调用:

int sizeLarge = SCREENLAYOUT_SIZE_LARGE // For 7" tablet
boolean is7InchTablet = context.getResources().getConfiguration()
    .isLayoutSizeAtLeast(sizeLarge);

int sizeXLarge = SCREENLAYOUT_SIZE_XLARGE // For 10" tablet
boolean is10InchTablet = context.getResources().getConfiguration()
    .isLayoutSizeAtLeast(sizeXLarge);

答案 7 :(得分:2)

您可以使用以下方法获取以英寸为单位的屏幕尺寸, 基于此,您只需检查设备是哪个平板电脑或手机。

private static double checkDimension(Context context) {

    WindowManager windowManager = ((Activity)context).getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    // since SDK_INT = 1;
    int mWidthPixels = displayMetrics.widthPixels;
    int mHeightPixels = displayMetrics.heightPixels;

    // includes window decorations (statusbar bar/menu bar)
    try
    {
        Point realSize = new Point();
        Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
        mWidthPixels = realSize.x;
        mHeightPixels = realSize.y;
    }
    catch (Exception ignored) {}

    DisplayMetrics dm = new DisplayMetrics();
    windowManager.getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(mWidthPixels/dm.xdpi,2);
    double y = Math.pow(mHeightPixels/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("debug","Screen inches : " + screenInches);
    return screenInches;
}

答案 8 :(得分:2)

我在 values文件夹中存储了一个值,该值为7英寸或10英寸,但我们可以使用values文件夹为任何设备执行此操作。

为不同的2设备创建不同的2值文件夹。但这件事取决于要求。

答案 9 :(得分:1)

您必须使用DisplayMetrics类提供的数据进行一些计算。

你有heightPixel和widthPixels(屏幕分辨率,以像素为单位)

您需要对角线,因为'英寸屏幕尺寸'始终描述对角线长度。 您可以以像素为单位获得屏幕对角线(使用毕达哥拉)

diagonalPixel =√(heightPixel²+widthPixels²)

然后,由于densityDPI值,您可以将像素值转换为英寸:

inchDiag = diagonalPixel / densityDPI。

我希望我没有在这里犯错误,请注意,从DisplayMetrics类获得的值是由构造函数给出的,它(根据极少数情况)显示它们根据物理材料设置得不好。 ..

这将为您提供物理屏幕大小,但它可能不是管理多个布局的更好方法。 More on this topics

答案 10 :(得分:1)

另一种方式:

  • 再创建2个文件夹:values-large + values-xlarge

  • 将:<string name="screentype">LARGE</string>放在values-large文件夹(strings.xml)

  • 将:<string name="screentype">XLARGE</string>放在values-xlarge文件夹(strings.xml)中

  • 在代码中:

    String mType = getString(R.string.screentype);

    if(mType!= null&amp;&amp; mType.equals(“LARGE”){

    //从4~7英寸

    } else if(mType!= null&amp;&amp; mType.equals(“XLARGE”){

    //从7~10英寸

    }

答案 11 :(得分:0)

Voila! ?这就是您需要将平板电脑与手机区分开的全部

1。帮助程序功能以获取屏幕宽度:

private float getScreenWidth() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    return Math.min(metrics.widthPixels, metrics.heightPixels) / metrics.density;
}

2。判断设备是否为平板电脑的功能

boolean isTablet() {
    return getScreenWidth() >= 600;
}

3。最后,如果您希望针对不同的设备尺寸执行不同的操作:

boolean is7InchTablet() {
    return getScreenWidth() >= 600 && getScreenWidth() < 720;
}

boolean is10InchTablet() {
    return getScreenWidth() >= 720;
}

答案 12 :(得分:0)

以下是一些有用的Kotlin扩展名:

    
    fun DisplayMetrics.isTablet(): Boolean {
        return getScreenWidth() >= 600
    }
    
    fun DisplayMetrics.is7InchTablet(): Boolean {
        return getScreenWidth() >= 600 && getScreenWidth() < 720
    }
    
    fun DisplayMetrics.is10InchTablet(): Boolean {
        return getScreenWidth() >= 720
    }
    
    fun DisplayMetrics.getScreenWidth(): Float {
        return widthPixels.coerceAtMost(heightPixels) / density
    }

相关问题