Android DisplayMetrics在ICS上以像素为单位返回不正确的屏幕大小

我试过这个….

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

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

 width = 720 height = 1184 

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

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

我发现这个隐藏的宝藏仅适用于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); 

编辑 (11/19/12)

上述代码将无法在Android 4.2上运行,并会抛出exception….我还没有find一种方法来获取Android 4.2中的设备的全屏幕大小。 当我这样做的时候,我会编辑这个答案,但是现在,你应该为android 4.2编写应急代码!

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

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

尝试这个

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

您可以使用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(可能还有其他)的模拟器中testing过。

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

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

在某些设备(如平板电脑)上,导航栏根本无法隐藏( 来源请参见“系统UI可见性控制”一节),因为没有硬件button作为备份。 如果在你的设备上,你已经设法隐藏栏,你可以使用getWidth()和getHeight()来全屏查看并请求其大小。

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