2012-06-12 11 views
18

Ho provato questo ....Android DisplayMetrics restituisce le dimensioni dello schermo non corretta in pixel su ICS

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

e ....

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

Il GNEX ha un display di 720 × 1280 . Il risultato restituito per la larghezza/altezza (a seconda dell'orientamento ovviamente) non è mai 1280. Ho pensato che questo potrebbe avere qualcosa a che fare con il sullo schermo barra di navigazione in Ice Cream Sandwich, quindi mi nasconde che con:

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

... e quindi ha avviato una discussione che registra continuamente l'altezza/larghezza della dimensione dello schermo. Anche dopo che la barra di navigazione di ICS era completamente sparita ... le dimensioni dello schermo non avrebbero mai riportato il valore 1280. Vorrei ottenere numeri come questo:

width = 720 
height = 1184 

Come si ottiene la risoluzione dello schermo del dispositivo reale in ICS?

Il motivo per cui ho bisogno di questo valore è perché la mia app riproduce video e vorrei per il video ad occupare l'intero schermo quando il dispositivo è in orientamento orizzontale. Ora so cosa stai pensando, perché non dare semplicemente alla videoview il valore di "match_parent" per l'altezza/larghezza? Il motivo è perché i miei video hanno più proporzioni e mi piacerebbe essere in grado di calcolare la dimensione del video corretta a seconda dell'intera larghezza dello schermo.

risposta

18

ho trovato questo tesoro nascosto per ICS SOLO ...... se ci si rivolge API superiore ICS vedono il commento di Chris Schmich di seguito.

How to hide and display the navigation bar on Android ICS build

Nel caso in cui il link muore .... ecco come ottenere la reale dimensione dello schermo del dispositivo .....

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

EDIT (11/19/12)

il codice di cui sopra non funziona su Android 4.2 e un'eccezione verrà gettato .... devo ancora trovare un modo per ottenere la dimensione pieno schermo di un dispositivo in Android 4.2. Quando lo farò, modificheremo questa risposta, ma per ora dovresti codificare con contingency per Android 4.2 !!

+1

- e perché Google deve farmi andare crudo? – dell116

+0

Grazie mille, mi fa risparmiare un sacco di problemi – Diljeet

+14

Su Android 4.2 (API 17) e versioni successive, è possibile utilizzare Display.getRealMetrics per ottenere le metriche di visualizzazione fisica effettive. Ho confermato che funziona sul mio Samsung Galaxy Nexus con Jelly Bean (4.2.1). Vedi http://developer.android.com/reference/android/view/Display.html#getRealMetrics(android.util.DisplayMetrics) –

1

Su alcuni dispositivi, ad esempio tablet, la barra di navigazione non può essere nascosta (source, vedere la sezione "Controlli per la visibilità dell'interfaccia utente di sistema") perché non ci sono pulsanti hardware come backup. Se sul tuo dispositivo sei riuscito a nascondere la barra, potresti creare una visualizzazione a schermo intero e richiedere le sue dimensioni con getWidth() e getHeight().

Per quanto ne so, non è un modo affidabile per ottenere la dimensione dello schermo su tutti i dispositivi ICS.

+0

Ci deve essere un modo per farlo. L'app di YouTube per ICS sta in qualche modo spazzando via la barra di navigazione di ICS e facendo sì che la videoview diventi l'intera larghezza dello schermo. – dell116

+0

Dipende dal dispositivo, sui tablet con ICS la barra è oscurata (i controlli sono nascosti), ma non è andata. – Stuart

+0

Stuart, non posso confermare se è possibile completare lo schermo della barra di navigazione del sistema operativo su un tablet con ICS, ma anche se ciò che dici è vero .... che nascondere la barra di navigazione del sistema operativo dipende dal dispositivo. ... Non so perché Google impedisca intenzionalmente a uno sviluppatore di ottenere le dimensioni esatte di un dispositivo. Che senso avrebbe? BTW .... per favore non prendere questo come un attacco alla tua risposta. Apprezzo la discussione! – dell116

6

Prova questa

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

Nel mio test limitato finora, getRealMetrics() fornisce i risultati corretti anche su dispositivi 4.0, dove ci si aspetterebbe che si verificasse un arresto anomalo. È anche degno di nota il fatto che getRealMetrics restituisca il DPI corretto, in cui gli altri metodi per ottenere un DisplayMetrics possono restituire dati fasulli. (Con gli altri metodi, il mio S4 stava affermando di essere un dispositivo mpdi!) – benkc

15

Dalla risposta di Ahmed, questo è il codice completo senza errori:

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

È possibile utilizzare getRealSize per ottenere la risoluzione dello schermo. È ufficialmente supportato in API 17 e versioni successive, ma in realtà esisteva nell'SDK dall'API 14.Se si utilizza la piattaforma SDK per API 17 o superiore, è possibile accedere al metodo normalmente e semplicemente ignorare l'avvertimento su di esso solo essere disponibili in 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;  
} 

Ho provato questo in un vero e proprio Android 5.0. 2 dispositivo e un emulatore in esecuzione 4.1.1 (e possibilmente altri).

Grazie a benc per pointing this out in the comments.

Problemi correlati