2013-02-13 2 views
8

Как определить, имеет ли устройство Android физические клавиши или панель навигации программного обеспечения? Мне нужно изменить макет в зависимости от того, нарисована ли навигационная система.Как определить, есть ли у устройства Android жесткие ключи

Например HTC Desire C имеет аппаратные клавиши: enter image description here

Я должен уточнить - Im глядя на панели навигации, а не клавиатуры. Дом, назад и т. Д. Я пробовал:

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

возвращает те же значения на обоих устройствах.

+0

Дубликат http://stackoverflow.com/questions/2415558/how-to-detect-hardware-keyboard-presence –

ответ

0

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

Кроме того, здесь подробнее. http://developer.android.com/reference/android/content/res/Configuration.html#keyboard

EDIT - Для проверки физической клавиатуры

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

Для получения дополнительной информации о различных конфигурациях просмотра http://developer.android.com/reference/android/content/res/Configuration.html#keyboard

Я уверен, что одна из этих работ.

2nd EDIT -

Проверьте. Уже спросил.

Android: Programmatically detect if device has hardware menu button

+0

Это не работает, он возвращает ложь на обоих устройствах – serenskye

+0

Проверьте обновление. – Synaero

+0

Нет, см. Выше, я получаю ту же клавиатуру для обоих устройств! Configuration.KEYBOARD_NOKEYS; – serenskye

40

решаемые делать это в первый раз, когда приложение запускается и сохранение предпочтениям:

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

Метод 'getRealMetrics' доступен только в API 17 (например, Android 4.2). Вы подразумеваете, что вы не знаете устройство, так что вы можете Я действительно полагаюсь на этот метод. –

+0

Я согласен с этим методом, потому что 'ViewConfiguration.get (context) .hasPermanentMenuKey()' сложно на некоторых устройствах. Поэтому, когда API> = 17, я использую этот метод вместо этого. – AlexAndro

+3

Я тоже использую эту технику на устройствах> = API 17. Не слишком придирчивый, но ваш оператор возврата может быть немного читабельнее: 'return (realWidth> displayWidth) || (realHeight> displayHeight) ' –

2

Здесь вы идете .. это должен делать то, что вы хотите.

@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

Новая галактика s5 не имеет ключа hardqare меню и по-прежнему использует жесткие ключи как дома, последние и назад ... Это не очень хорошие варианты использования. – roiberg

Смежные вопросы