2015-02-09 16 views
5

我正在用透明导航栏编写Android应用程序。为了相应地调整布局,我需要知道设备是否有软件或硬件按钮。检查Android设备是否有软件或硬件导航按钮

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

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); 

这种方法并不像三星注4或HTC其中一个没有菜单键一些新的设备上工作,但还是有硬件按钮。

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); 
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME); 
boolean hasHardwareButtons = hasBackKey && hasHomeKey; 

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

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

+3

可能重复[如何判断一个Android设备是否具有硬键(http://stackoverflow.com/questions/14853039/how-to -tell-an-an-android-device-has-hard-keys) – 2015-02-09 10:46:50

回答

5

参见this answer。您可以以像素为单位获得显示屏的实际高度,然后获取可用于应用程序的高度,并确定设备是否具有带有这些值的屏幕导航栏。

+0

谢谢,我没有发现这个问题。这工作:) – Phoca 2015-02-09 15:04:15

1

答案发布here做到了。只是为了完整性,这里是我现在使用的代码:的

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; 
} 
相关问题