Android:如何获取设备的实际屏幕尺寸?

13

我尝试了不同的方法来获取设备的屏幕尺寸,但它总是返回错误的尺寸(791x480 而不是 854x480)。可能是由于导航栏造成的。我的设备当前正在运行JellyBean 4.1.1。

我尝试过:

Display display = getWindowManager().getDefaultDisplay();  
Point size = new Point();
display.getSize(size);
OpenGLRenderer.widthScreen = size.x;
OpenGLRenderer.heightScreen = size.y;

而且:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
String resolution = dm.widthPixels + "x" + dm.heightPixels;

我正在使用以下代码将应用程序置于全屏状态:

setContentView(mGLSurfaceView);
mGLSurfaceView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

我注意到在logcat中,返回了正确的大小:

01-01 03:05:06.967: I/InputReader(1961): 
    Device reconfigured: id=8, name='cyttsp-spi', 
    surface size is now 480x854, mode is 1

在我的AndroidManifest文件中:

uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"

我使用了:

为什么我无法获得真实大小(480x854)?或者如何使用“设备重新配置”返回的表面?


1
尝试使用getRealMetrics方法:http://developer.android.com/reference/android/view/Display.html#getRealMetrics(android.util.DisplayMetrics) - Jameo
我有点困惑。你问如何获取设备的物理尺寸,然后又说你得到了减去导航栏的尺寸。接着你又说你已经获取了设备的物理尺寸。那么你的问题具体在哪里? - DeeV
@deev 你说得对,我想知道如何获取设备的物理尺寸,我只是假设返回给我的尺寸是减去导航栏的。我正在寻找一种编写代码的方法,可以为任何设备提供物理尺寸。 - Trois
@jameo 我正在尝试使用你的方法,但是当我尝试这样做时: 'final DisplayMetrics metrics = new DisplayMetrics(); Display display = getWindowManager().getDefaultDisplay(); display.getRealMetrics(metrics);' 我得到了一个 getRealMetrics 错误,错误提示为“getRealMetrics(DisplayMetrics) 方法对于类型 Display 是未定义的”。有任何想法吗? - Trois
你在Logcat中说你得到了期望的大小。但是Log不会为你更改变量,所以我仍然感到困惑。 - DeeV
我在logcat中看到的具有良好值的那一行不是我控制的结果。它不是由我编写的代码行引起的,而是自动返回的,因此我想知道应该使用哪个函数来获取正确的大小(或者如何获取自动返回的正确值并将其放入变量中)。如果更清楚的话。 - Trois
4个回答

14

试着打电话。

    display.getRealSize();

免责声明: 我没有意识到这一点,但这仅适用于API 17(Android 4.2 / JellyBean)及以上版本。


13

试一下这个

 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);
        realWidth = metrics.widthPixels;
        realHeight = metrics.heightPixels;
    }
    else{
    // Below Jellybeans you can use reflection method 

        mGetRawH = Display.class.getMethod("getRawHeight");
        mGetRawW = Display.class.getMethod("getRawWidth");

        try {
            realWidth = (Integer) mGetRawW.invoke(display);
            realHeight = (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();
        }
    }

2
这应该是JELLY_BEAN_MR1而不是JELLY_BEAN,以便>= 17吗? - ThomasRS
我同意Thomas的看法,应该是JELLY_BEAN_MR1。 - Ethan

0

如果你想在活动中获取大小,可以使用以下代码实现。

findViewById(android.R.id.content).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            View view =  findViewById(android.R.id.content);
            Log.e("test", "root view height is " + view.getHeight());

        }
    });

0

我在一台Android 3.2平板电脑上遇到了同样的问题。我测试了getRealSize和getDisplayMetrics两个方法。它们应该会崩溃,因为它们只能在API 17及以上版本中使用。但奇怪的是,在我的3.2版本上,getDisplayMetrics并没有崩溃,而是返回了正确的尺寸,而getRealSize则会崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接