Recibe todos los caracteres unicode de SoftInput cuando usa android NativeActivity

Tengo una aplicación OpenGL que utiliza NativeActivity . Cuando le pregunto el nombre del usuario, llamo a un método java a través de JNI para abrir un teclado de software para mí. El juego muestra su propio cuadro de diálogo de introducción de texto nativo dentro del contexto de OpenGL. Todos los caracteres unicode deben ser utilizables en el nombre.

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

Mi clase de Java extiende KeyEvent.Callback así que recibo la entrada del teclado a través de los métodos onKeyDown(int keyCode, KeyEvent event) y onKeyMultiple(int keyCode, int count, KeyEvent event) . A continuación, pasar la entrada recibida a mi aplicación de C + + a través de JNI.

Mi problema es el manejo de los caracteres unicode no onKeyMultiple en el método onKeyMultiple . Se parece a esto:

 @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; } 

Por ejemplo, cuando introdujo un carácter "risa sonriente" en el teclado, el texto siempre se interpreta como un "rectángulo vertical blanco" – se debe mostrar como 😅 . Incluso se muestra como un rectángulo cuando examino el contenido de la cadena en el depurador de Android Studio.

Si analizo el texto en bytes con text.GetBytes(Charset.forName("UTF-8")) Veo que la representación de bytes difiere con diferentes caracteres unicode. Sin embargo, si paso la matriz de bytes resultante a C ++ y analizarla de nuevo a cadena de C ++, el resultado es el mismo. El carácter unicode se muestra como basura.

El método event.getUnicodeChar() devuelve siempre 0 en estos casos.

Mi pregunta es, ¿cómo puedo recibir todas las pulsaciones de teclado desde el teclado suave? Realmente no me importa cómo se hace, sólo que mi cadena de C + + recibe los caracteres unicode derecho y luego puedo representarlos en la pantalla.

Recibir una entrada completa de android unicode en C / C ++ es casi (pero no bastante) la misma pregunta. La diferencia es que me gustaría manejar la entrada de teclado en Java y sólo enviar los caracteres resultantes de nuevo a lado de C + +. También el código dado en la respuesta se enfrenta al mismo problema: no todas las entradas de teclado resultan un carácter unicode derecho.

Androide – obtener teclas de teclado suave prensas discute acerca de esto también. Advierte que la página Oficial de Android dice que nunca debe confiar en recibir eventos clave para ninguna tecla en un método de entrada suave (un teclado en pantalla) . La sugerencia es utilizar la interfaz TextWatcher para observar los caracteres presionados en el teclado del software. Si este es el camino a seguir, me gustaría obtener algunos consejos para implementar esto en mi clase que extiende NativeActivity . No tengo campos de texto editables en la aplicación, sólo una ventana de OpenGL.

Por ejemplo, ¿es posible poner alguna ventana transparente / vista / diálogo encima de mi contexto OpenGL y obtener los caracteres unicode correctos del teclado de software de esa manera?

Esto parece ser un problema de Android Studio, que no es capaz de representar caracteres UTF-8 en su consola de depuración o depurador. Si inicio el registro de adb desde la línea de comandos, los caracteres UTF-8 correctos aparecen en los registros.

Como dije en la pregunta, la representación de bytes difiere con diferentes caracteres unicode. Y eso es todo lo que importa. Si pasa la cadena a C ++ (como bytearray o como cadena), todos los caracteres están correctamente allí.

También cambié el programa para implementar la interfaz de KeyEvent.Callback lugar de KeyEvent.Callback , pero eso es principalmente porque la documentación oficial de Android recomienda hacerlo. Pero para la pregunta no importa qué interfaz / clase utilice para leer el teclado del software.

  • Insertar símbolos unicode en edittext
  • ¿Deshabilitar emoji de reemplazo unicode en Android Chrome?
  • Imprimir unicode personaje Android TextView
  • Deteniendo texto de división a varias líneas en los períodos en direcciones web
  • Diferentes idiomas en la vista de texto en Android
  • Cómo probar unidades de manejo de texto bidireccional
  • Escriba el número dentro de ayah end unicode símbolo árabe
  • ¿Hay algún carácter unicode que tiene el glifo que falta en todas las fuentes?
  • Diferenciación de los lenguajes CJK (chino, japonés y coreano) en Android
  • No se muestra la versión de WebView UTF-8 de Android
  • Android: ¿Cómo usar los glifos japoneses de Unihan?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.