Обнаруживать доступность мягкой навигационной панели в устройстве onePlusOne?

Мне нужно проверить, есть ли у устройства мягкая навигационная панель, и я следил за предложениями здесь .

Он отлично работает, за исключением устройств onePlus, по некоторым причинам, этот код:

int id = resources.getIdentifier("config_showNavigationBar", "bool", android"); return id > 0 && resources.getBoolean(id); 

Возвращает false, хотя отображается мягкая навигационная панель.

Любая идея, как я могу получить правильный результат?

Я предпочитаю не вычислять реальную ширину и доступную ширину, это кажется дорогой операцией.

Благодарю.

См. Этот ответ. Однако нет возможности быть на 100% уверенным.

 boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME); if (hasBackKey && hasHomeKey) { // no navigation bar, unless it is enabled in the settings } else { // 99% sure there's a navigation bar } 

редактировать

Другой подход

 public boolean hasNavBar (Resources resources) { int id = resources.getIdentifier("config_showNavigationBar", "bool", "android"); return id > 0 && resources.getBoolean(id); } 

Да, вы можете попробовать следующее:

  WindowManager mgr = (WindowManager) getSystemService(WINDOW_SERVICE); boolean hasSoftKey = Utils.hasSoftKeys(mgr, NPTApplication.this); public static boolean hasSoftKeys(WindowManager windowManager, Context c) { boolean hasSoftwareKeys = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Display d = windowManager.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; } 

Нет, не будет работать так, как вам нужно вычислить размер

Используемый метод подробно описан в этом ответе SO;

Как получить высоту и ширину навигационной панели программно

Ну есть метод hasPermanentMenuKey который проверяет MenuKey аппаратного MenuKey , обычно устройства samsung имеют его на левой кнопке Home .

Поэтому, если он возвращает true, это означает, что у телефона есть аппаратные клавиши, и если его false, то просто это означает, что у телефона есть панель навигации.

Метод:

 ViewConfiguration.hasPermanentMenuKey() 

Мне это очень полезно для меня. Я надеюсь, что это помогает