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.
- ¿Son compatibles todos los caracteres Unicode en Android?
- Unicode en Android
- Carácter de unicode de entrada de shell de adb
- Cómo descodificar el char unicode en cadena de Java?
- No se reciben los caracteres unicode GCM de Android
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?
- ¿Faltan codecs de Unicode en kivy / Python en Android?
- ¿Cómo puedo contribuir al proyecto de Android en el apoyo / representación del idioma que no sea el inglés?
- Android IME que acepta unicode
- No se pudo encontrar la clase 'android.graphics.drawable.RippleDrawable' Unicode issue?
- Proteger la aplicación de la descompilación ocultando Manifest y convirtiendo el código en un carácter Unicode
- ¿Cómo usar unicode en los recursos de Android?
- Char a cadena secuencia desajuste en Java para caracteres Unicode
- Enviar un mensaje SMS (UTF-16) con un carácter desconocido reemplazado por un "carácter de reemplazo" en Android
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.
- Android deslizar y agregar unidad de fuerza
- ¿Cómo asegurarse de que AlarmManager se dispara incluso si la aplicación Android está cerrada?