在onePlusOne设备中逐步检测软导航栏的可用性?

时间:2016-06-08 09:54:22

标签: android

我需要检查设备是否有软导航栏,然后我按照建议here进行操作。

它的效果很好,除了在onePlus设备上,出于某种原因,这段代码:

int id = resources.getIdentifier("config_showNavigationBar", "bool", android");
    return id > 0 && resources.getBoolean(id);
尽管显示了软导航栏,但

返回false。

知道如何才能得到正确的结果?

我更喜欢不计算实际宽度和可用宽度,这似乎是昂贵的操作。

感谢。

5 个答案:

答案 0 :(得分:2)

请参阅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);
}

答案 1 :(得分: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;
    }

答案 2 :(得分:0)

不会那样,你必须计算尺寸

使用的方法详见本SO答案;

How to get height and width of navigation bar programmatically

答案 3 :(得分:0)

嗯,有一种方法hasPermanentMenuKey会检查硬件MenuKey是否存在,通常三星设备的左侧大小为Home按钮。

因此,如果它返回true,则表示手机有硬件密钥,如果它是假的,那么只是意味着手机有导航栏。

方法是:

ViewConfiguration.hasPermanentMenuKey()

我发现它对我自己非常有用。

答案 4 :(得分:0)

//当隐藏导航栏时,该方法可以返回0。

private fun getNavigationBarHeight(context: Context): Int {
    val display = context.windowManager?.defaultDisplay
    return if (display == null) {
        0
    } else {
        val realMetrics = DisplayMetrics()
        display.getRealMetrics(realMetrics)
        val metrics = DisplayMetrics()
        display.getMetrics(metrics)
        realMetrics.heightPixels - metrics.heightPixels
    }
}