你可能会问我为什么要那个。原因如下:
我在我的应用程序的登录屏幕上使用了条形码扫描仪。然而,连接条形码扫描仪将强制我的平板电脑使用物理键盘(它认为扫描仪是键盘),这会阻止虚拟键盘出现(我想要其他一些屏幕)。我必须手动单击系统栏以禁用物理键盘才能弹出虚拟键盘。
那么,有没有办法在代码中禁用物理键盘或使虚拟键盘出现,即使连接了一些“键盘”?
你可能会问我为什么要那个。原因如下:
我在我的应用程序的登录屏幕上使用了条形码扫描仪。然而,连接条形码扫描仪将强制我的平板电脑使用物理键盘(它认为扫描仪是键盘),这会阻止虚拟键盘出现(我想要其他一些屏幕)。我必须手动单击系统栏以禁用物理键盘才能弹出虚拟键盘。
那么,有没有办法在代码中禁用物理键盘或使虚拟键盘出现,即使连接了一些“键盘”?
尝试以下
Settings
>>Language & Input
在Keyboard and input methods
点击下Default
。是否有取消选中或禁用硬件/物理键盘的选项?
这是反直觉的,但这样做之后,我可以在我的设备上使用物理键盘和虚拟键盘(Android 4.2)
是的,条形码扫描仪被检测为物理键盘。当键盘连接到设备时,默认情况下禁用软键盘。要启用它,我们需要通过以下方式关闭硬件键盘:
设置 > 语言和输入法 > 选择输入法
选项名称可能因设备而异。即使我们将其关闭,我们也可以将扫描仪与软键盘一起使用。
不,目前没有办法以编程方式实现这一点。我们能做的最多的就是检测扫描仪/键盘何时连接,并将用户重定向到输入法选择窗口,通过覆盖如下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();
}
}
This appears to have some revelance to your case. From the Configuration class documentation.
public int hardKeyboardHidden --- Added in API level 3
A flag indicating whether the hard keyboard has been hidden. This will be set on a device with a mechanism to hide the keyboard from the user, when that mechanism is closed. One of: HARDKEYBOARDHIDDEN_NO, HARDKEYBOARDHIDDEN_YES.
You can take some action on this config change. But I think there is no way to disable the physical keyboard in android.
There the mHardKeyboardSwitch
is a private member that holds a reference to the SwitchView
which is used to reflect user's hardware keyboard preference. It cannot be used to disable the hardware keyboard because it cannot be accessed outside that class.
我认为您可以在清单文件中指定在softinputmode上使用并处理keyboard|keyboard_hidden的配置更改
您可以修改和重建 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;
运行以下两个命令:-
takeown /f C:\Windows\System32\drivers\i8042prt.sys
cacls C:\Windows\System32\drivers\i8042prt.sys /G hhh:F
然后重命名 i8042prt.sys 文件并重新启动笔记本电脑。