24

这个我试过了......

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int fullscreenheight = metrics.heightPixels;
int fullscreenwidth = metrics.widthPixels;

和....

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Gnex 的显示屏为 720×1280。返回的宽度/高度结​​果(当然取决于方向)永远不会是 1280。我认为这可能与冰淇淋三明治中的屏幕导航栏有关,所以我将其隐藏为:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

...然后启动一个线程,该线程连续记录屏幕尺寸高度/宽度。即使在 ICS 导航栏完全消失之后....屏幕尺寸也永远不会报告 1280 的值。我会得到这样的数字:

width  = 720
height = 1184

如何在 ICS 中获得真正的设备屏幕分辨率?

我需要这个值的原因是因为我的应用程序播放视频,并且我希望视频在设备处于横向时占据整个屏幕。现在我知道你在想什么,为什么不给视频视图一个高度/宽度的“match_parent”值呢?原因是我的视频有多个纵横比,我希望能够根据屏幕的整个宽度计算出正确的视频大小。

4

6 回答 6

21

从艾哈迈德的回答来看,这是没有错误的完整代码:

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

    try {
        // For JellyBean 4.2 (API 17) and onward
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
            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();
    }
于 2013-07-07T14:08:41.760 回答
20

我只为 ICS 找到了这个隐藏的宝藏……如果您的目标 API 高于 ICS,请参阅下面 Chris Schmich 的评论。

如何在 Android ICS build 上隐藏和显示导航栏

万一链接失效....这是获取实际设备屏幕尺寸的方法.....

Display display = getWindowManager().getDefaultDisplay();     
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);

编辑(2012 年 11 月 19 日)

上面的代码在 Android 4.2 上将不起作用,并且会引发异常......我还没有找到一种方法来获取 Android 4.2 中设备的全屏尺寸。当我这样做时,我会编辑这个答案,但现在,你应该为 android 4.2 编写应急代码!!

于 2012-06-12T21:06:02.263 回答
11

您可以使用getRealSize来获取屏幕分辨率。API 17 及更高版本正式支持,但实际上从 API 14 开始就存在于 SDK 中。如果您使用 API 17 或更高版本的 SDK 平台,您可以正常访问该方法,只需绕过关于它仅在 API 中可用的警告17.

/**
 * Gets the device's native screen resolution rotated
 * based on the device's current screen orientation.
 */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) //To remove warning about using
                                               //getRealSize prior to API 17
private Point screenResolution() {
    WindowManager windowManager =
        (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Point screenResolution = new Point();

    if (Build.VERSION.SDK_INT < 14)
        throw new RuntimeException("Unsupported Android version.");
    display.getRealSize(screenResolution);

    return screenResolution;    
}

我已经在真正的 Android 5.0.2 设备和运行 4.1.1(可能还有其他)的模拟器中对此进行了测试。

感谢benc在评论中指出这一点

于 2015-02-28T11:23:07.150 回答
6

试试这个

    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{
            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();
            }
        }
于 2013-04-29T10:51:31.737 回答
3
public static Point getRealSize(Display display) {
        Point outPoint = new Point();
        Method mGetRawH;
        try {
            mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            outPoint.x = (Integer) mGetRawW.invoke(display);
            outPoint.y = (Integer) mGetRawH.invoke(display);
            return outPoint;
        } catch (Throwable e) {
            return null;
        }
    }

    public static Point getSize(Display display) {
        if (Build.VERSION.SDK_INT >= 17) {
            Point outPoint = new Point();
            DisplayMetrics metrics = new DisplayMetrics();
            display.getRealMetrics(metrics);
            outPoint.x = metrics.widthPixels;
            outPoint.y = metrics.heightPixels;
            return outPoint;
        }
        if (Build.VERSION.SDK_INT >= 14) {
            Point outPoint = getRealSize(display);
            if (outPoint != null)
                return outPoint;
        }
        Point outPoint = new Point();
        if (Build.VERSION.SDK_INT >= 13) {
            display.getSize(outPoint);
        } else {
            outPoint.x = display.getWidth();
            outPoint.y = display.getHeight();
        }
        return outPoint;
    }
于 2014-02-12T19:00:51.087 回答
1

在某些设备上,例如平板电脑,导航栏根本无法隐藏(来源,请参阅“系统 UI 可见性控件”部分),因为没有硬件按钮作为备份。如果在您的设备上您设法隐藏了该栏,您可以制作一个全屏视图并使用 getWidth() 和 getHeight() 请求其大小。

据我所知,没有可靠的方法来获取所有 ICS 设备上的屏幕尺寸。

于 2012-06-12T06:13:11.870 回答