2013-02-13 24 views
8

Jak sprawdzić, czy urządzenie z Androidem ma fizyczne klucze lub pasek nawigacyjny oprogramowania? Muszę zmienić układ zależny od tego, czy rysowana jest nawigacja oprogramowania.Jak sprawdzić, czy urządzenie z Androidem ma twarde klucze?

Na przykład HTC Desire C ma klucze sprzętowe: enter image description here

powinienem wyjaśnić - Im patrząc na pasku nawigacyjnym, a nie klawiatury. Strona główna, z powrotem itp. Próbowałem:

 getResources().getConfiguration().keyboard); 
     getResources().getConfiguration().navigation); 
     getResources().getConfiguration().navigationHidden); 

zwraca te same wartości na obu urządzeniach.

+0

Duplikat http://stackoverflow.com/questions/2415558/how-to-detect-hardware-keyboard-presence –

Odpowiedz

0

private boolean isHardwareKeyboardAvailable() { return getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS; }

Ponadto, tutaj jest więcej informacji. http://developer.android.com/reference/android/content/res/Configuration.html#keyboard

EDIT - Aby sprawdzić fizycznej klawiatury

private boolean isPhysicalKeyboardAvailable() { return getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY; }

Aby uzyskać więcej informacji na temat różnych składów zobaczyć http://developer.android.com/reference/android/content/res/Configuration.html#keyboard

Jestem pewien, jedna z tych prac.

2nd EDIT -

Czek. Już zapytałem.

Android: Programmatically detect if device has hardware menu button

+0

ten nie działa, zwraca false na obu urządzeniach – serenskye

+0

Sprawdź aktualizację. – Synaero

+0

Nie, patrz wyżej, otrzymuję tę samą klawiaturę dla obu urządzeń! Configuration.KEYBOARD_NOKEYS; – serenskye

40

rozwiązać robiąc to po raz pierwszy, aplikacja jest uruchomiona i zapisywanie preferencji:

public static boolean hasSoftKeys(WindowManager windowManager){ 
    boolean hasSoftwareKeys = true; 
    //c = context; use getContext(); in fragments, and in activities you can 
    //directly access the windowManager(); 

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR1){ 
     Display d = c.getWindowManager().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; 

     hasSoftwareKeys = (realWidth - displayWidth) > 0 || 
          (realHeight - displayHeight) > 0; 
    } else { 
     boolean hasMenuKey = ViewConfiguration.get(c).hasPermanentMenuKey(); 
     boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); 
     hasSoftwareKeys = !hasMenuKey && !hasBackKey; 
    } 
    return hasSoftwareKeys; 
} 
+1

Metoda 'getRealMetrics' jest dostępna tylko w API 17 (tj. Android 4.2) - Sugerujesz, że nie znasz urządzenia, więc możesz naprawdę polegać na tej metodzie. –

+0

Zgadzam się z tą metodą, ponieważ 'ViewConfiguration.get (context) .hasPermanentMenuKey()' jest trudne na niektórych urządzeniach. Więc kiedy API> = 17, używam tej metody zamiast tego. – AlexAndro

+3

Ja również używam tej techniki na urządzeniach> = API 17. Nie być zbyt wybrednym, ale twoja instrukcja return może być trochę bardziej czytelna: 'return (realWidth> displayWidth) || (realHeight> displayHeight) ' –

2

Tu idziesz .. to powinno robić, co chcesz.

@SuppressLint("NewApi") 
private static boolean hasSoftNavigation(Context context) 
{ 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){ 
     return !ViewConfiguration.get(context).hasPermanentMenuKey(); 
    } 
    return false; 
} 
+4

Nowa galaktyka s5 nie ma klawisza hardqare menu i nadal używa twardych klawiszy jako domu, ostatnio i z powrotem ... To nie jest dobra opcja do użycia. – roiberg

Powiązane problemy