2015-09-14 4 views
7

Sto cercando di rilevare quando un dispositivo è in grado di emettere alla risoluzione 4K UHD (3840x2160). Un certo numero di dispositivi come nVidia Shield TV e Sony Xperia Z5 Premium segnaleranno che funzionano a 1080p anche se sono in grado di UHD, perché sono predefiniti per l'uscita 1080p per i layout non video. Ho bisogno di un modo per rilevare se sono in grado di distinguere 4K tra loro e dispositivi non-4K come il Nexus Player.Rilevamento di schermi UHD 4K su Android

Ecco il codice che sto usando per determinare la risoluzione corrente:

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

Sulla TV Shield, restituisce 1920x1080 per tutto il tempo, anche quando ExoPlayer riferisce che è l'output video a 3840x2160.

+0

Hai provato questo http://stackoverflow.com/a/3166582/1944049? –

+0

Su Shield TV, il codice riporta una densità di xhdpi e 320 dpi. Dovrebbe riportare xxxhdpi e 640 dpi. – Cobar

+0

Stessa situazione per la Sony X83C .. non c'è davvero nessun modo affidabile per rilevare 4K su Android TV? –

risposta

3

UPDATE: Questo è stato risolto come di ExoPlayer 1.5.1 (vedi https://github.com/google/ExoPlayer/commit/79055066813123c939c29e5a5e223a5ff043b91e)


Ho seguito con gli sviluppatori di ExoPlayer e hanno trovato la risposta:

L'unico modo per rilevare in modo affidabile 4K dispositivi utilizza Device.Mode che è disponibile solo in api livello 23+. Vedere la nota Android M su quella qui:

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

E la documentazione per la classe qui:

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

Per quanto riguarda ExoPlayer non implementa questo codice, a partire dalla versione attuale (1.4.2) ma probabilmente cambierà. Vedere:

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

E infine per rispondere alla domanda, il modo giusto per rilevare 4K in questo momento è qualcosa di simile:

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

che darà risultati errati sulle api meno di 23.

+0

Grazie per aver parlato con ExoPlayer. Ci sono pochissimi dispositivi Android TV sul mercato, quindi penso che tu possa tranquillamente impostare tutti i dispositivi Android TV come 4K e quindi escludere quelli che supportano solo 1080p. Gli unici dispositivi 1080p di cui sono a conoscenza sono Nexus Player e Razer Forge TV. – Cobar

+0

Non ho fatto la ricerca per sapere se quello che dici è vero, ma il problema con questo è che ExoPlayer non esegue il rendering del flusso 4K anche se lo si specifica come sorgente. Ecco perché il problema è segnalato come bug nel progetto ufficiale. Ciò che accadrà (a meno che non si annullino le funzioni difettose) è che ExoPlayer lo ridurrà al 1920. Spero che cambi presto. –

+0

Per i televisori Sony questa funzione non funziona ancora. Tuttavia, quello del commit ExoPlayer collegato funziona, ha un rilevamento speciale per Sony Bravia. –