检查Android设备是否有软件或硬件导航按钮

Pho*_*oca 9 android

我正在编写一个带透明导航栏的Android应用程序.要相应地调整布局,我需要知道设备是否有软件或硬件按钮.

在我的研究期间,我遇到了以下解决方案:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
Run Code Online (Sandbox Code Playgroud)

这种方法不适用于三星Note 4或HTC One等新设备,它们没有菜单键,但仍有硬件按钮.

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
boolean hasHardwareButtons = hasBackKey && hasHomeKey;
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为一些设备,如索尼Xperia Z3 Compact,虽然它有一个软件导航栏,但它返回true.

有没有可靠的方法来确定是否有物理按钮或软件导航栏?

Jon*_*ica 9

看到这个答案.您可以获得显示的实际高度(以像素为单位),然后获取应用程序可用的高度,并确定设备是否具有包含这些值的屏幕导航栏.


Pho*_*oca 6

这里发布的答案就是诀窍.为了完整起见,这是我现在使用的代码:

private static boolean hasImmersive;
private static boolean cached = false;

@SuppressLint ("NewApi")
public static boolean hasImmersive(Context ctx) {

    if (!cached) {
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            hasImmersive = false;
            cached = true;
            return false;
        }
        Display d = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).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;

        hasImmersive = (realWidth > displayWidth) || (realHeight > displayHeight);
        cached = true;
    }

    return hasImmersive;
}
Run Code Online (Sandbox Code Playgroud)