Android 如何获得真实的屏幕高度和宽度?

Android 如何获得真实的屏幕高度和宽度?,android,Android,我使用这些代码来获得屏幕的高度和宽度 我的Nexus7上的屏幕高度应为1280 但它返回1205 我的版本是8级 所以我不能用这些方法: DisplayMetrics metrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(metrics); screenWidth = metrics.widthPixels; screenHeight = metrics.heightPixel

我使用这些代码来获得屏幕的高度和宽度

我的Nexus7上的屏幕高度应为1280

但它返回1205

我的版本是8级

所以我不能用这些方法:

DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
现在,我应该如何获得正确的屏幕大小

编辑:


使用它工作

我想这会管用的。诀窍是你必须使用:

if (Build.VERSION.SDK_INT >= 11) {
        Point size = new Point();
        try {
            this.getWindowManager().getDefaultDisplay().getRealSize(size);
            screenWidth = size.x;
            screenHeight = size.y;
        } catch (NoSuchMethodError e) {
            Log.i("error", "it can't work");
        }

    } else {
        DisplayMetrics metrics = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        screenWidth = metrics.widthPixels;
        screenHeight = metrics.heightPixels;
    }
不是

要解决API 8编码问题,请执行以下操作:

display.getSize(size);
只有较新的API设备才会有屏幕上的导航按钮,因此需要新方法,较旧的设备会抛出异常,但不会有屏幕上的导航,因此较旧的方法很好


如果需要说明的话:仅仅因为您的项目有一个minimumAPI级别8,并不意味着您必须在该级别编译它。我也至少使用了8级,但我的项目大多是在13级(3.2)进行编译的,这使他们能够使用许多新方法。

我编写了一个方法,该方法将尽可能接近API 10到17+。它应该为API14+提供真实的宽度和高度,并且它对其他所有内容都能提供

try { 
    display.getRealSize(size);
    height = size.y; 
} catch (NoSuchMethodError e) {
    height = display.getHeight();
}

您可以使用
Display
DisplayMetrics

使用显示:

    Display display = context.getWindowManager().getDefaultDisplay();
    int realWidth;
    int realHeight;

    if (Build.VERSION.SDK_INT >= 17){
        //new pleasant way to get real metrics
        DisplayMetrics realMetrics = new DisplayMetrics();
        display.getRealMetrics(realMetrics);
        realWidth = realMetrics.widthPixels;
        realHeight = realMetrics.heightPixels;

    } else if (Build.VERSION.SDK_INT >= 14) {
        //reflection for this weird in-between time
        try {
            Method mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            realWidth = (Integer) mGetRawW.invoke(display);
            realHeight = (Integer) mGetRawH.invoke(display);
        } catch (Exception e) {
            //this may not be 100% accurate, but it's all we've got
            realWidth = display.getWidth();
            realHeight = display.getHeight();
            Log.e("Display Info", "Couldn't use reflection to get the real display metrics.");
        }

    } else {
        //This should be close, as lower API devices should not have window navigation bars
        realWidth = display.getWidth();
        realHeight = display.getHeight();
    }
private void findRealSize(Activity activity)
{
    Point size = new Point();
    Display display = activity.getWindowManager().getDefaultDisplay();

    if (Build.VERSION.SDK_INT >= 17)
        display.getRealSize(size);
    else
        display.getSize(size);

    int realWidth = size.x;
    int realHeight = size.y;

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
}
使用DisplayMetrics:

    Display display = context.getWindowManager().getDefaultDisplay();
    int realWidth;
    int realHeight;

    if (Build.VERSION.SDK_INT >= 17){
        //new pleasant way to get real metrics
        DisplayMetrics realMetrics = new DisplayMetrics();
        display.getRealMetrics(realMetrics);
        realWidth = realMetrics.widthPixels;
        realHeight = realMetrics.heightPixels;

    } else if (Build.VERSION.SDK_INT >= 14) {
        //reflection for this weird in-between time
        try {
            Method mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            realWidth = (Integer) mGetRawW.invoke(display);
            realHeight = (Integer) mGetRawH.invoke(display);
        } catch (Exception e) {
            //this may not be 100% accurate, but it's all we've got
            realWidth = display.getWidth();
            realHeight = display.getHeight();
            Log.e("Display Info", "Couldn't use reflection to get the real display metrics.");
        }

    } else {
        //This should be close, as lower API devices should not have window navigation bars
        realWidth = display.getWidth();
        realHeight = display.getHeight();
    }
private void findRealSize(Activity activity)
{
    Point size = new Point();
    Display display = activity.getWindowManager().getDefaultDisplay();

    if (Build.VERSION.SDK_INT >= 17)
        display.getRealSize(size);
    else
        display.getSize(size);

    int realWidth = size.x;
    int realHeight = size.y;

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
}

这有用吗?不,我不能使用
display.getSize(size)由于my min SDK为8级,如果您阅读trojanfoe链接中的一些注释,它们会建议如下内容:尝试{display.getSize(size);width=size.x;height=size.y;}catch(NoSuchMethodError e){width=display.getWidth();height=display.getHeight();}。。。。但是,即使您可以使用getSize()方法,我认为您仍然可以获得1205分辨率,即可用的屏幕高度(即减去导航按钮)。不确定如何获得导航按钮的高度,但感兴趣且外观美观。在编辑中,您检查API级别>=11。Display#getRealSize()是在API级别17中添加的,因此您应该检查该级别。您可以检查设备上的api级别,而不是使用try-catch块。请参阅Build.VERSION和methods Display.getHeight、Display.getSize、Display.getRealSize请记住,此方法不适用于API级别14、15和16,因为
getRealSize()
方法仅在API级别17中引入。这里有一个找到原始值的变通方法private void findRealSize(Activity activity) { DisplayMetrics displayMetrics = new DisplayMetrics(); if (Build.VERSION.SDK_INT >= 17) { activity.getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics); } else { activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); } int realWidth = displayMetrics.widthPixels; int realHeight = displayMetrics.heightPixels; Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight); }