如何在代码中禁用物理键盘(始终使用虚拟键盘)

21
您可能想知道我为什么要这样做,原因如下:
我在我的应用程序的登录屏幕上使用了条形码扫描器。然而,连接条形码扫描器将强制我的平板电脑使用物理键盘(它认为扫描器是键盘),这会阻止虚拟键盘弹出(我希望在其他屏幕上使用虚拟键盘)。我必须手动点击系统栏以禁用物理键盘,以使虚拟键盘弹出。
那么,有没有办法在代码中禁用物理键盘或使虚拟键盘即使连接了某些“键盘”也能弹出?

@Lapin-Blanc,你找到这个问题的解决方案了吗? - Mohsin Naeem
1
是的,我找到了解决方案:请看这里:https://dev59.com/k2kv5IYBdhLWcg3wfA0P#10580746 - Lapin-Blanc
1
@LukasKnuth 条形码扫描不是我的问题 :) 但是“物理键盘”是。 - Mohsin Naeem
@MMohsinNaeem 是的,但如果这样,你就不需要先连接一个外部条形码扫描仪到你的平板电脑了。 - Lukas Knuth
@MMohsinNaeem 你能修改这个应用程序吗?还是你正在寻找一个系统范围的设置,当选择输入字段时,强制始终显示软输入法? - Enrico
显示剩余7条评论
6个回答

8
请尝试以下方法:
设置 中选择 语言和输入法,在 键盘和输入法 下点击 默认。是否有选项可以取消勾选或禁用硬件/物理键盘?
虽然这似乎不合情理,但通过这样做,我可以在我的设备(Android 4.2)上同时使用物理键盘和虚拟键盘。

@MMohsinNaeem 你在使用哪个蓝牙扫描器? - Enrico
如果你拒绝提供有用的信息,我们怎么能帮助你呢?Android 4.2和3.0完全不同。 - Enrico
我猜Android > 3.0是正确的信息。不是吗?4.2是在3.0之后发布的 :) 所以更具体地说,我拥有的平板正在运行自定义Mediapad_2.06.26_OsiMood - Mohsin Naeem
嗨,恩里科。这是一个相当古老的帖子了,但我想知道你在使用Jelly Bean时是用的平板还是手机?似乎你可以在从Honeycomb到ICS的平板上使用该方法,但我无法在运行相同版本的手机上使用该方法。如果Jelly Bean可以在手机上做到这一点,我可能需要升级! - Stuart Robertson
我相当确定我是在我的Galaxy Nexus上。 - Enrico
显示剩余3条评论

3

这似乎与您的情况有些相关。来自Configuration类文档。

public int hardKeyboardHidden --- 自API级别3中添加

指示硬键盘是否已隐藏的标志。当设备具有隐藏键盘的机制并关闭该机制时,将设置此选项。其中之一: HARDKEYBOARDHIDDEN_NO、HARDKEYBOARDHIDDEN_YES。

您可以对此配置更改采取某些措施。但是我认为在Android中没有禁用物理键盘的方法。

更新

在那里mHardKeyboardSwitch是一个私有成员,它持有对SwitchView的引用,该视图用于反映用户的硬件键盘首选项。无法使用它来禁用硬件键盘,因为在该类之外无法访问它。


谢谢回复。但是Configuration类只是告诉状态,我们无法更改它。在这里http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/com/android/systemui/statusbar/tablet/InputMethodsPanel.java#82,`Button mHardKeyboardSwitch处理Physical keyboard`。也许您可以帮我找到它调用了什么来关闭它。到目前为止,我还没有找到它 :) - Mohsin Naeem
是的,我已经看到这种方法。但我在寻找一些运气。也许Settings.Secure.putXXXX(resolver, name, value)可以帮助我? - Mohsin Naeem
是的,我知道上面那行代码只能在已经root过的设备上运行。所以我们假设我有一个已经root过的设备。 - Mohsin Naeem
在设备获取 root 权限后,几乎所有的功能都可以按照您的意愿进行操作。但是我认为您的应用程序需要与设置应用程序具有相同的“android:sharedUserId”。试一试,否则告诉我。 - Ron
我不知道如何在root后获取它?应该使用什么命令来关闭物理键盘? - Mohsin Naeem
抱歉...我没有找到编程上禁用它的方法,即使在设置代码中也是如此。设置应用程序只隐藏或显示硬件键盘部分,并在其中反映键盘的状态(是否连接或断开)。 - Ron

3
是的,条形码扫描器被检测为物理键盘。当键盘连接到设备时,默认情况下软键盘被禁用。要启用它,我们需要通过以下方式关闭硬件键盘:
设置 > 语言和输入 > 选择输入法
选项名称可能因设备而异。即使我们关闭软键盘,我们仍然能够使用扫描器以及软键盘。
否,当前没有程序化实现这一点的方法。我们所能做的最多的事情就是检测到扫描器/键盘连接并将用户重定向到输入法选择窗口,通过覆盖onConfigurationChanged方法来实现:
@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {

    ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
                                  .showInputMethodPicker();
    Toast.makeText(this, "Barcode Scanner detected. Please turn OFF Hardware/Physical keyboard to enable softkeyboard to function.", Toast.LENGTH_LONG).show();
  }
}

2

我认为您可以在清单文件中指定使用 softinputmode 并处理键盘 | 键盘隐藏的配置更改。


我想要的是,只有在虚拟键盘显示或消失时才调用 Virtual Keyboard AFAIK 配置更改。 但是,当“物理键盘连接”时,我如何强制启动虚拟键盘? - Mohsin Naeem
在你的Activity中尝试一下这个:@Override public void onCreate(Bundle savedInstanceState) {getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);} - VivekNR
另一种可行的方法是,如果您只在模拟器上运行,则可以编辑模拟器设置,取消选中“硬件键盘存在”选项。这样,您的模拟器将仅从屏幕键盘接收输入。 希望这有所帮助... - VivekNR
HID设备连接到平板电脑时,我需要解决方案。 :) - Mohsin Naeem
你应该尝试查看平台,并将NFC读卡器的输入作为keyevent注入...这消除了使用外部键盘的必要。 - VivekNR
@Mohsin Naeem,你找到解决方案了吗?我也遇到了同样的问题。 - Suresh Sharma

0

运行以下两个命令:

takeown /f C:\Windows\System32\drivers\i8042prt.sys

cacls C:\Windows\System32\drivers\i8042prt.sys /G hhh:F

然后重命名i8042prt.sys文件并重新启动笔记本电脑。


问题是关于Android,而不是Windows。 - Dan Breslau

0

您可以修改和重建AFS。 打开位于mydroid/frameworks/base/services/java/com/android/server/wm的WindowManagerService.java文件。

查找类似以下的行:

if (hardKeyboardAvailable != mHardKeyboardAvailable) {
     mHardKeyboardAvailable = hardKeyboardAvailable;
     mHardKeyboardEnabled = hardKeyboardAvailable;
     mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
     mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
}

将3行替换为mHardKeyboardEnabled = false;


不实用,因为它使物理键盘无法使用。 - Robin Gawenda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接