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