2015-02-09 9 views
5

Sto scrivendo un'app Android con una barra di navigazione trasparente. Per regolare il layout di conseguenza, devo sapere se il dispositivo ha pulsanti software o hardware.Verifica se il dispositivo Android ha pulsanti di navigazione software o hardware

Durante la mia ricerca mi sono imbattuto le seguenti soluzioni:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); 

Questo approccio non funziona su alcuni nuovi dispositivi come il Samsung Note 4 o HTC One, che non hanno un tasto del menu, ma hanno ancora pulsanti hardware.

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); 
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME); 
boolean hasHardwareButtons = hasBackKey && hasHomeKey; 

Questo non funziona altrettanto bene, perché alcuni dispositivi come il Sony Xperia Z3 Compact restituiscono vero anche se ha una barra di navigazione del software.

Esiste un modo affidabile per scoprire se ci sono pulsanti fisici o una barra di navigazione del software?

+3

possibile duplicato di [Come dire se un dispositivo Android dispone di tasti duri] (http://stackoverflow.com/questions/14853039/how-to -tell-se-an-android-device-has-hard-keys) –

risposta

5

Vedere this answer. Puoi ottenere l'altezza reale del display in pixel, e quindi avere l'altezza disponibile per la tua app, e capire se il dispositivo ha una barra di navigazione sullo schermo con questi valori.

+0

Grazie, non ho trovato quella domanda. Ha funzionato :) – Phoca

1

La risposta inviata here ha risolto il problema. Solo per completezza, ecco il codice che sto usando ora:

private static boolean hasImmersive; 
private static boolean cached = false; 

@SuppressLint ("NewApi") 
public static boolean hasImmersive(Context ctx) { 

    if (!cached) { 
     if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
      hasImmersive = false; 
      cached = true; 
      return false; 
     } 
     Display d = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

     DisplayMetrics realDisplayMetrics = new DisplayMetrics(); 
     d.getRealMetrics(realDisplayMetrics); 

     int realHeight = realDisplayMetrics.heightPixels; 
     int realWidth = realDisplayMetrics.widthPixels; 

     DisplayMetrics displayMetrics = new DisplayMetrics(); 
     d.getMetrics(displayMetrics); 

     int displayHeight = displayMetrics.heightPixels; 
     int displayWidth = displayMetrics.widthPixels; 

     hasImmersive = (realWidth > displayWidth) || (realHeight > displayHeight); 
     cached = true; 
    } 

    return hasImmersive; 
} 
Problemi correlati