Android 当存在自定义输入设备(通过/dev/uinput注册)时,不存在软键盘

Android 当存在自定义输入设备(通过/dev/uinput注册)时,不存在软键盘,android,android-ndk,keyboard,Android,Android Ndk,Keyboard,我开发了一个自定义输入(使用/dev/uniput)来向设备输入远程字符。在某些设备上(例如Nexus7),如果uinput设备注册它处理QWERTY键,则不会显示软键盘。通过实验,我发现如果我只注册键0-9,就会显示软键盘,除此之外,我还可以“插入”键0-9。如果我注册其他键(QWERTY),软键盘将不再显示 注册是使用ioctl(m_fd,UI_SET_KEYBIT,key)完成的,其中m_fd是打开的/dev/uinput设备,key是该设备应该支持的密钥的linux密钥代码 这是一个问题

我开发了一个自定义输入(使用
/dev/uniput
)来向设备输入远程字符。在某些设备上(例如Nexus7),如果uinput设备注册它处理QWERTY键,则不会显示软键盘。通过实验,我发现如果我只注册键
0
-
9
,就会显示软键盘,除此之外,我还可以“插入”键
0
-
9
。如果我注册其他键(QWERTY),软键盘将不再显示

注册是使用
ioctl(m_fd,UI_SET_KEYBIT,key)
完成的,其中
m_fd
是打开的
/dev/uinput
设备,key是该设备应该支持的密钥的linux密钥代码

这是一个问题,因为大多数重音字符都不能以其他方式输入(如
等)-如果有软键盘,它们可以(使用软件键盘)输入


是否有某种类型的“注册开关”来告诉android平台在需要用户输入时(即在编辑文本焦点上)让软键盘不显示?

您是否尝试过其他键盘(如Swype或Swiftkey)?键盘软件中有一个功能决定是否显示,我相信如果有硬件键盘,默认键盘会隐藏自己。这是谷歌的预期行为。我知道,至少有一次我让Swype出现在键盘上,而它是一个正面键盘。我不知道代码库中是否仍然存在该代码。这是另一个想法-添加你自己作为一个隐藏键盘可能会工作,如果它不阻止你的输入(它会认为你是一个封闭的滑出kb)。加布,我没有尝试Swype或Swiftkey,因为该应用程序必须与所有类型的键盘一起工作。我将查看键盘注册文件,看看是否可以以某种方式绕过此问题。有些设备允许您“禁用硬件键盘”,然后您可以恢复软键盘。但是N7,比如说,没有。然后我认为你有点卡住了(尽管它可能值得一试,只是为了确认)。隐藏或不隐藏软键盘的决定是软键盘的选择-它从显示的一个评估输入视图返回true或false。评估标准取决于键盘本身。如果它决定如果有一个键盘它不应该出现,那么它就不会出现。如果我启用了多个输入法(即,除了默认键盘之外,我还可以在通知中看到“选择输入法”。在那里,我可以“禁用”硬件键盘(这实际上并不能阻止uinput设备停止工作),这会启动内置的谷歌键盘。这并不能解决最初的问题,但这是输入重音字符的一种解决方法。如果为硬件键盘选择了适当的布局,则可以使用硬件键盘输入重音字符(使用设置->语言和输入配置屏幕)。