gpt4 book ai didi

java - 使用 android NativeActivity 时从 SoftInput 接收所有 unicode 字符

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:04 26 4
gpt4 key购买 nike

我有一个使用 NativeActivity 的 OpenGL 应用程序。当我询问用户的姓名时,我通过 JNI 调用一个 java 方法为我打开一个软件键盘。游戏在 OpenGL 上下文中显示了自己的 native 文本输入对话框。名称中应使用所有 unicode 字符。

public static void JNI_keyboardShow() {
InputMethodManager imm = (InputMethodManager)Main.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(m_window.getDecorView(), InputMethodManager.SHOW_IMPLICIT);
}

我的 java 类扩展了 KeyEvent.Callback 所以我通过覆盖 onKeyDown(int keyCode, KeyEvent event)onKeyMultiple(int keyCode, int count) 接收键盘输入, KeyEvent 事件) 方法。然后,我通过 JNI 将接收到的输入传递到我的 C++ 应用程序。

我的问题是在 onKeyMultiple 方法中处理非 ascii unicode 字符。它看起来像这样:

@Override
public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) {
int unicode = event.getUnicodeChar();
Log.e(TAG, "Unicode: " + unicode);

String text = null;
if(event.getAction() == KeyEvent.ACTION_MULTIPLE && keyCode == KeyEvent.KEYCODE_UNKNOWN) {
text = event.getCharacters();
}

Log.e(TAG, "Text: " + text);
if(text != null) {
//call native function and pass string to it
nativeOnKeyDown(text);
}
return true;
}

例如,当我在键盘上输入“笑脸”字符时,文本总是被解释为“白色垂直矩形” - 它应该显示为 😎。当我在 Android Studio 的调试器中检查字符串的内容时,它甚至显示为一个矩形。

如果我使用 text.GetBytes(Charset.forName("UTF-8")) 将文本解析为字节,我发现字节表示因不同的 unicode 字符而不同。但是,如果我将生成的字节数组传递给 C++ 并将其解析回 C++ 字符串,结果是相同的。 unicode字符显示为垃圾。

在这些情况下,方法 event.getUnicodeChar() 总是返回 0。

我的问题是,如何从软键盘接收所有键盘按下操作?我真的不关心它是如何完成的,只关心我的 C++ 字符串接收正确的 unicode 字符然后我可以将它们呈现到屏幕上。

Receive complete android unicode input in C/C++几乎(但不完全)是同一个问题。不同之处在于我想在 Java 端处理键盘输入,并且只将结果字符发送回 C++ 端。答案中给出的代码也面临同样的问题:并非所有键盘输入都会产生正确的 unicode 字符。

android - getting soft keyboard key presses也在讨论这个问题。它警告说官方 Android 页面说你永远不应该依赖于接收软输入法(屏幕键盘)上任何键的键事件。建议使用TextWatcher接口(interface)来观察软键盘上按下的字符。如果这是要走的路,我想得到一些指示如何在我的扩展 NativeActivity 的类中实现它。我的应用程序中没有任何可编辑的文本字段,只有一个 OpenGL 窗口。

例如,是否可以在我的 OpenGL 上下文之上放置一些透明窗口/ View /对话框,并通过这种方式从软件键盘获取正确的 unicode 字符?

最佳答案

这似乎是 Android Studio 的问题,它无法在其调试控制台或调试器中呈现 UTF-8 字符。如果我从命令行启动 adb 日志记录,正确的 UTF-8 字符会出现在日志中。

就像我在问题中所说的那样,字节表示因不同的 unicode 字符而异。这才是最重要的。如果将字符串传递给 C++(作为字节数组或字符串),所有字符都正确存在。

我还更改了程序以实现 TextWatcher 接口(interface)而不是 KeyEvent.Callback,但这主要是因为官方 Android 文档建议这样做。但是对于这个问题,你使用哪个接口(interface)/类来读取软键盘并不重要。

关于java - 使用 android NativeActivity 时从 SoftInput 接收所有 unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35635021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com