Android DisplayMetrics devuelve un tamaño de pantalla incorrecto en píxeles en ICS

He intentado esto …

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

y….

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

El Gnex tiene una pantalla de 720 × 1280. El resultado devuelto para ancho / alto (dependiendo de la orientación del curso) nunca es 1280. Pensé que esto podría tener algo que ver con la barra de navegación en pantalla en Ice Cream Sandwich, así que lo escondo con:

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

… y luego comenzó un hilo que continuamente registra el tamaño / ancho de la pantalla. Incluso después de que la barra de navegación ICS desapareció por completo … el tamaño de la pantalla nunca informaría el valor 1280. Me gustaría obtener números como este:

 width = 720 height = 1184 

¿Cómo se obtiene la verdadera resolución de pantalla del dispositivo en ICS?

La razón por la que necesito este valor es porque mi aplicación reproduce video y me gustaría que el video ocupe toda la pantalla cuando el dispositivo está en orientación horizontal. Ahora sé lo que estás pensando, ¿por qué no simplemente le das a la vista de video un valor de “match_parent” para el alto / ancho? La razón es porque mis videos tienen múltiples relaciones de aspecto y me gustaría poder calcular el tamaño de video correcto en función de todo el ancho de la pantalla.

Encontré este tesoro escondido para ICS SOLAMENTE …… si estás apuntando a una API más alta que ICS, mira el comentario de Chris Schmich a continuación.

Cómo ocultar y mostrar la barra de navegación en la construcción de Android ICS

En caso de que el enlace muera … aquí está cómo obtener el tamaño de pantalla del dispositivo real …..

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

EDITAR (19/11/12)

El código anterior NO FUNCIONARÁ en Android 4.2 y se lanzará una excepción …. Todavía tengo que encontrar la manera de obtener el tamaño de pantalla completo de un dispositivo en Android 4.2. Cuando lo haga, voy a editar esta respuesta, pero por ahora, debe codificar con contingencia para Android 4.2 !!

De la respuesta de Ahmed, este es el código completo sin error:

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

Puede usar getRealSize para obtener la resolución de la pantalla. Se admite oficialmente en API 17 y superior, pero en realidad existía en el SDK desde API 14. Si utiliza la plataforma SDK para API 17 o superior, puede acceder al método normalmente y omitir la advertencia de que solo está disponible en 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; } 

Probé esto en un dispositivo Android 5.0.2 real y un emulador ejecutando 4.1.1 (y posiblemente otros).

Gracias a benc por señalar esto en los comentarios .

Prueba esto

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

En algunos dispositivos, por ejemplo, tabletas, la barra de navegación no se puede ocultar en absoluto ( fuente , consulte la sección ‘Controles para la visibilidad de la interfaz de usuario del sistema’) porque no hay botones de hardware como respaldo. Sin embargo, si en su dispositivo ha logrado ocultar la barra, puede hacer una vista de pantalla completa y solicitar su tamaño con getWidth () y getHeight ().

Hasta donde yo sé, no hay una manera confiable de obtener el tamaño de la pantalla en todos los dispositivos ICS.