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:
- Cómo cambiar el color de fondo del área de información en un ImageCardView?
- Android: OnClickListener no responde en carga inicial?
- Preferencias de Android TV estándar
- ¿Cómo aumentar el tamaño de un elemento centrado en un recyvlerview?
- ¿Cómo uso las herramientas: overrideLibrary en un archivo build.gradle?
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.
- Fusión del manifiesto de Gradle de Android falló
- Android Tv: obtener la lista de canales
- ¿Cómo puedo comprobar si una aplicación se está ejecutando en un Android TV
- Establecer márgenes entre elementos en BrowseFragment
- Target Fire TV, Android y Android TV con Gradle
- Recurso no encontrado: Theme.Leanback
- Cómo conectar el emulador de TV Android a Internet?
- Agregar elementos en BrowseFragment Header en Android TV
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.
- Barra de acciones – elemento del submenú con texto e imagen no funcionando correctamente
- URLConnection conteo de bytes de bajo nivel