Detección de pantallas UHD de 4K en Android

Estoy tratando de detectar cuando un dispositivo es capaz de salida a 4K UHD (3840×2160) de resolución. Varios dispositivos como el nVidia Shield TV y el Sony Xperia Z5 Premium informarán que están funcionando a 1080p a pesar de que son capaces de UHD, ya que por defecto a la salida de 1080p para los diseños de vídeo no. Necesito alguna forma de detectar si son 4K capaz de distinguir entre ellos y dispositivos que no son de 4K como el Nexus Player.

Aquí está el código que estoy usando para determinar la resolución actual:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); 

En el Shield TV, esto devuelve 1920×1080 todo el tiempo, incluso cuando ExoPlayer informa de que está saliendo de vídeo a 3840×2160.

UPDATE: Se ha corregido desde ExoPlayer 1.5.1 (consulte https://github.com/google/ExoPlayer/commit/79055066813123c939c29e5a5e223a5ff043b91e )


Seguí con los desarrolladores de ExoPlayer y encontré la respuesta:

La única manera de detectar de forma fiable dispositivos 4K es usar Device.Mode que sólo está disponible en el nivel 23 de api. Vea la nota de Android M sobre eso aquí:

https://developer.android.com/preview/api-overview.html#4K-display

Y la documentación para la clase aquí:

https://developer.android.com/reference/android/view/Display.Mode.html#getPhysicalWidth ()

En cuanto a ExoPlayer no implementa este código, a partir de la versión actual (1.4.2), pero que probablemente cambiará. Ver:

https://github.com/google/ExoPlayer/issues/800

Y finalmente para responder a la pregunta, la manera correcta de detectar 4K ahora es algo como esto:

 /** * Used to check if the connected device support UHD (3840x2160) * * Note that this call will fail to identify UHD devices on api level bellow 23 (M) * * @return 1 if device is UHD, 0 otherwise */ public int isUHD(){ Display display = getActivity().getWindowManager().getDefaultDisplay(); Point displaySize = getDisplaySize(display); return (displaySize.x >= 3840 && displaySize.y >= 2160) ? 1 : 0; } /** * Convenience function that forks to the different ways to obatin the Display size across Android versions * * @param display Display instance to obtain information from * * @return Point a Point describing the Display size */ private static Point getDisplaySize(Display display) { Point displaySize = new Point(); if(Util.SDK_INT >= 23){ getDisplaySizeV23(display, displaySize); }else if(Util.SDK_INT >= 17) { getDisplaySizeV17(display, displaySize); } else if(Util.SDK_INT >= 16) { getDisplaySizeV16(display, displaySize); } else { getDisplaySizeV9(display, displaySize); } return displaySize; } @TargetApi(23) private static void getDisplaySizeV23(Display display, Point outSize){ Display.Mode[] modes = display.getSupportedModes(); if(modes.length > 0){ Display.Mode mode = modes[0]; outSize.x = mode.getPhysicalWidth(); outSize.y = mode.getPhysicalHeight(); } } @TargetApi(17) private static void getDisplaySizeV17(Display display, Point outSize) { display.getRealSize(outSize); } @TargetApi(16) private static void getDisplaySizeV16(Display display, Point outSize) { display.getSize(outSize); } private static void getDisplaySizeV9(Display display, Point outSize) { outSize.x = display.getWidth(); outSize.y = display.getHeight(); } 

Que dará resultados erróneos en api menos de 23.

  • Proyecto AndroidStudio que admite Android y AndroidTV
  • Soporte múltiple de apk para Android TV y teléfono
  • Android TV no inicia actividad correcta
  • Android TV no está iniciando LAUNCH_LEANBACK Actividad
  • Reutilizando AndroidTV RowsFragment fuera de BrowseFragment
  • Cómo implementar más de 2 niveles de navegación en com.android.support:leanback-v17
  • Cómo obtener enfoque para EditText y navegar usando D-pad en Android TV
  • Emulador de Android TV con API de Google
  • Utilizar la API de Youtube en Android TV
  • Detectar el uso de Google Cast
  • Implementar y diseñar aplicaciones de Android para TV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.