如何判断android设备是否有硬键

如何判断android设备是否有硬键,android,Android,我如何判断android设备是否有物理键或软件导航栏?我需要根据是否绘制软件导航来更改布局 例如,HTC Desire C具有硬件密钥: 我应该澄清一下——我看的是导航栏,不是键盘。回家,回家等等。我试过: getResources().getConfiguration().keyboard); getResources().getConfiguration().navigation); getResources().getConfigurati

我如何判断android设备是否有物理键或软件导航栏?我需要根据是否绘制软件导航来更改布局

例如,HTC Desire C具有硬件密钥:

我应该澄清一下——我看的是导航栏,不是键盘。回家,回家等等。我试过:

        getResources().getConfiguration().keyboard);
        getResources().getConfiguration().navigation);
        getResources().getConfiguration().navigationHidden);

在两个设备上返回相同的值

私有布尔值isHardwareKeyboardAvailable(){return getResources().getConfiguration().keyboard!=Configuration.keyboard\u NOKEYS;}

此外,这里还有更多信息

编辑-检查物理键盘

private boolean isPhysicalKeyboardAvailable(){return getResources().getConfiguration().keyboard==Configuration.keyboard\u QWERTY;}

有关“不同配置”视图的更多信息

我相信其中一个是有效的

第二版-

检查。已经问过了


第一次启动应用程序时执行此操作并保存到首选项即可解决此问题:

public static boolean hasSoftKeys(WindowManager windowManager){
    boolean hasSoftwareKeys = true;
    //c = context; use getContext(); in fragments, and in activities you can 
    //directly access the windowManager();

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR1){
        Display d = c.getWindowManager().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;
}

给你。。这应该是你想要的

@SuppressLint("NewApi")
private static boolean hasSoftNavigation(Context context)
{
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
        return !ViewConfiguration.get(context).hasPermanentMenuKey();
    }
    return false;
}

基于@Sereskye的解决方案

private fun Activity.hasSoftKeys(): Boolean {
    val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        display
    } else {
        windowManager.defaultDisplay
    } ?: return true

    val realDisplayMetrics = DisplayMetrics()
    display.getRealMetrics(realDisplayMetrics)

    val realHeight = realDisplayMetrics.heightPixels
    val realWidth = realDisplayMetrics.widthPixels

    val displayMetrics = DisplayMetrics()
    display.getMetrics(displayMetrics)

    val displayHeight = displayMetrics.heightPixels
    val displayWidth = displayMetrics.widthPixels

    return realWidth - displayWidth > 0 || realHeight - displayHeight > 0
}

重复否,请参见上文,我为两台设备提供相同的键盘!配置.键盘\无键;看到帖子,我说我对菜单按钮不感兴趣,带有硬按钮的现代设备没有菜单按钮。我很想升级这个,特别是因为它解决了我的问题(确定是否有硬件QWERTY键盘可用),但是我认为OP要求的是一些不同的东西…方法
getRealMetrics
仅在API 17(即Android 4.2)中可用-你的意思是你不了解设备,因此你不能真正依赖此方法。我同意此方法,因为
ViewConfiguration.get(context).hasPermanentMenuKey()
在某些设备上很棘手。因此,当API>=17时,我使用此方法。我现在也在>=API 17的设备上使用此技术。不要吹毛求疵,但您的return语句可能更具可读性,如:
return(realWidth>displayWidth)|(realHeight>displayHeight)
注意:如果您从服务执行此操作,并且该服务在设备全屏(如Youtube等)时意外启动,你会得到错误的结果。@benjamindavis你不应该忽视这些答案,如果他们在发帖前觉得自己的代码必须是完美的,它将停止ppl回答。新的galaxy s5没有菜单硬键,它仍然使用硬键作为home、recent和back。。。这不是一个好的选择。