Android 檢查裝置是否存在 導航欄 NavigationBar

yangxi_001發表於2016-03-17

目前也沒有可靠的方法來檢查裝置上是否有導航欄。可以使用KeyCharacterMap.deviceHasKey來檢查裝置上是否有某些物理鍵,比如說選單鍵、返回鍵、Home鍵。然後我們可以通過存在物理鍵與否來判斷是否有NavigationBar(一般來說手機上物理鍵、NavigationBar共存).

public static int getNavigationBarHeight(Activity activity) {
		Resources resources = activity.getResources();
		int resourceId = resources.getIdentifier("navigation_bar_height",
				"dimen", "android");
		//獲取NavigationBar的高度
		int height = resources.getDimensionPixelSize(resourceId);
		return height;
	}

上面這段程式碼,在絕大多數情況下都能獲取到NavigationBar的高度。所以有人想通過這個高度來判斷是否有NavigationBar 是不行的。當然4.0版本以下就不用說了。確認個問題,NavigationBar是4.0以上才有麼?

因為裝置有物理鍵仍然可以有一個導航欄。任何裝置執行自定義rom時都會設定一個選項,是否禁用的物理鍵,並新增一個導航欄。看看API:

ViewConfiguration.get(Context context).hasPermanentMenuKey()  有這麼一句描述 :Report if the device has a permanent menu key available to the user(報告如果裝置有一個永久的選單主要提供給使用者).


android.view.KeyCharacterMap.deviceHasKey(int keyCode) 的描述:Queries the framework about whether any physical keys exist on the any keyboard attached to the device that are capable of producing the given key code(查詢框架是否存在任何物理鍵盤的任何鍵盤連線到裝置生產給出關鍵程式碼的能力。).


那麼解決的辦法就是:

@SuppressLint("NewApi") 
	public static boolean checkDeviceHasNavigationBar(Context activity) {

		//通過判斷裝置是否有返回鍵、選單鍵(不是虛擬鍵,是手機螢幕外的按鍵)來確定是否有navigation bar
		boolean hasMenuKey = ViewConfiguration.get(activity)
				.hasPermanentMenuKey();
		boolean hasBackKey = KeyCharacterMap
				.deviceHasKey(KeyEvent.KEYCODE_BACK);

		if (!hasMenuKey && !hasBackKey) {
			// 做任何你需要做的,這個裝置有一個導航欄
			return true;
		}
		return false;
	}

尊重原創、尊重作者,轉載請標明出處:

http://blog.csdn.net/lnb333666/article/details/41821149

相關文章