【问题标题】:Check if Android device has software or hardware navigation buttons检查 Android 设备是否有软件或硬件导航按钮
【发布时间】:2015-02-09 09:31:52
【问题描述】:

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

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

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

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

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

这也不好用,因为像 Sony Xperia Z3 Compact 这样的设备虽然有一个软件导航栏,但仍返回 true。

有没有可靠的方法可以判断是否有物理按钮或软件导航栏?

【问题讨论】:

标签: android


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2011-11-10
      • 2012-02-21
      • 2014-08-13
      • 2016-08-31
      • 2017-06-04
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多