¿Hay alguna manera de determinar la altura de la pantalla física de Android en cm o pulgadas?

Necesito saber exactamente qué tan grande es la pantalla en el dispositivo en unidades reales de longitud, así que puedo calcular la aceleración debida a la gravedad en píxeles por milisegundo.

¿Hay algún método en alguna parte de la API de Android para esto?

Use lo siguiente:

DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); double x = Math.pow(mWidthPixels/dm.xdpi,2); double y = Math.pow(mHeightPixels/dm.ydpi,2); double screenInches = Math.sqrt(x+y); Log.d("debug","Screen inches : " + screenInches); 

Cuando mWidthPixels y mHeightPixels se toman del código siguiente

 private void setRealDeviceSizeInPixels() { WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); // since SDK_INT = 1; mWidthPixels = displayMetrics.widthPixels; mHeightPixels = displayMetrics.heightPixels; // includes window decorations (statusbar bar/menu bar) if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) { try { mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display); mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display); } catch (Exception ignored) { } } // includes window decorations (statusbar bar/menu bar) if (Build.VERSION.SDK_INT >= 17) { try { Point realSize = new Point(); Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); mWidthPixels = realSize.x; mHeightPixels = realSize.y; } catch (Exception ignored) { } } 

Vea esta publicación como referencia: Obtenga las dimensiones de la pantalla en píxeles

para obtener el tamaño actual use Math.round al final.

  DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); double x = Math.pow(dm.widthPixels/dm.xdpi,2); double y = Math.pow(dm.heightPixels/dm.ydpi,2); double screenInches = Math.sqrt(x+y); Log.d("debug","Screen inches : " + screenInches); screenInches= (double)Math.round(screenInches * 10) / 10; 

información de pantalla de desarrolladores de Android.

use xdpi * widthPixels y ydpi * heightPixels puede obtener lo que quiere, creo.

El siguiente fragmento de código te ayudará a obtener el tamaño de pantalla en pulgadas

 public static double getScreenSizeInches(Activity activity){ WindowManager windowManager = activity.getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); // since SDK_INT = 1; int mWidthPixels = displayMetrics.widthPixels; int mHeightPixels = displayMetrics.heightPixels; // includes window decorations (statusbar bar/menu bar) if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) { try{ mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display); mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display); } catch (Exception ignored) {} } // includes window decorations (statusbar bar/menu bar) if (Build.VERSION.SDK_INT >= 17) { try { Point realSize = new Point(); Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); mWidthPixels = realSize.x; mHeightPixels = realSize.y; } catch (Exception ignored) {} } DisplayMetrics dm = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); double x = Math.pow(mWidthPixels / dm.xdpi, 2); double y = Math.pow(mHeightPixels / dm.ydpi, 2); return Math.sqrt(x + y); } 

Espero que esto ayude.

Necesita usar la densidad de pantalla para calcular esto.

 Context.getResources().getDisplayMetrics().density 

De acuerdo con la documentación:

La densidad lógica de la pantalla. Este es un factor de escala para la unidad Density Independent Pixel, donde un DIP es un píxel en una pantalla de aproximadamente 160 ppp (por ejemplo, una pantalla de 240×320, 1.5 “x2”), proporcionando la línea base de la pantalla del sistema. Por lo tanto, en una pantalla de 160 ppp este valor de densidad será 1; en una pantalla de 120 ppp sería .75; etc.

Este valor no sigue exactamente el tamaño real de la pantalla (dado por xdpi y ydpi, sino que se usa para escalar el tamaño de la interfaz de usuario general en pasos en función de los cambios generales en los ppp de la pantalla. Por ejemplo, una pantalla de 240×320 tendrá una densidad de 1 incluso si su ancho es 1.8 “, 1.3”, etc. Sin embargo, si la resolución de la pantalla aumenta a 320×480 pero el tamaño de la pantalla se mantuvo 1.5 “x2”, entonces la densidad se incrementaría (probablemente a 1.5).