2016-06-08 39 views
5

我需要檢查一個設備是否有軟導航欄,我遵循建議here一步檢測onePlusOne設備中的軟導航欄可用性?

它的偉大工程,除了上萬普拉斯設備,出於某種原因,這個代碼:

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

返回false,即使顯示了軟導航欄。

任何想法如何才能得到正確的結果?

我不想計算真正的寬度和可用寬度,它看起來像昂貴的操作。

謝謝。

+0

弄來了一個解決方案? –

+1

是的。最後,我用這個代碼: public boolean hasNavBar(){ Display d = getWindowManager()。getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); d.getRealMetrics(dm); int realHeight = dm.heightPixels; int realWidth = dm.widthPixels; d.getMetrics(dm); int displayHeight = dm.heightPixels; int displayWidth = dm.widthPixels; return(realWidth - displayWidth)> 0 || (realHeight - displayHeight)> 0; } 這給了所有設備上最好的結果。 – Sharas

回答

0

以及存在一種方法hasPermanentMenuKey它檢查如果硬件MenuKey存在時,通常三星設備具有它Home按鈕的左大小。

所以,如果它返回true,這意味着手機有硬件鍵,如果它的錯誤,那麼簡單地說,它意味着手機有導航欄。

的方法是:

ViewConfiguration.hasPermanentMenuKey() 

我覺得我自己非常有用。我希望它可以幫助

+0

這不適用於像HTC一個和一個加一個設備。這總是返回true –

1

請參閱this答案。儘管如此,沒有辦法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); 
} 
+0

這不適用於像HTC自定義ROM的設備 –

+0

@SureshKumar請參閱編輯。這是一個替代解決方案。 –

+0

這沒有爲我工作在htc之一我:/ –

1

是的,你可以試試這個:

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; 
    } 
+0

沒有爲我工作在htc之一我:/ –