Google se compromete a promover la equidad racial para las comunidades negras. Ver cómo.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Soporte de editor de métodos de entrada

Las actualizaciones realizadas en estas áreas específicas de visualización se proporcionan a continuación:

Android 10 admite teclado de software para aplicaciones que se ejecutan en una pantalla no predeterminada.

Aplicaciones que se ejecutan en una pantalla no predeterminada

En términos de qué pantalla muestra el teclado del software del Editor de métodos de entrada (IME), hay dos modos diferentes. El teclado del software se muestra en:

  • Misma pantalla en la que aparece la aplicación enfocada.
  • Pantalla predeterminada mientras la aplicación enfocada se ejecuta en una pantalla no predeterminada.

El sistema determina qué modo usar en función de la configuración de la pantalla en la que aparece la aplicación enfocada. Para más detalles, ver:

  • DisplayWindowSettings#shouldShowImeLocked()
  • DisplayWindowSettings#setShouldShowImeLocked()

Figura 1. Teclado del software IME tal como aparece en la pantalla secundaria, incluida la aplicación de destino

El sistema usa un solo IME, pero puede cambiar entre pantallas para seguir el enfoque del usuario. Android 10 espera automáticamente que todos los IME de primera y tercera parte revisen el diseño y cambien el tamaño de acuerdo con el nuevo tamaño de pantalla cuando se creen.

Si hay una conexión activa en la pantalla A, y un campo de entrada solicita el foco de entrada en la pantalla B, se produce el siguiente flujo:

  1. Una nueva conexión de entrada proviene del campo de entrada en la pantalla B.
  2. InputMethodManagerService comprueba si se debe aprobar la conexión.
  3. Se selecciona una pantalla para el IME. Si la pantalla B admite mostrar el IME y se le permite mostrarlo, entonces se usa B. De lo contrario, se selecciona la pantalla del dispositivo principal.
  4. Si la pantalla seleccionada no es de la pantalla A, entonces se restablece la conexión. InputMethodService se destruye y luego se crea nuevamente.

Restricción de seguridad

El sistema no mostrará un IME en pantallas virtuales que no son propiedad del sistema. Esto se debe a una preocupación de seguridad de que una aplicación maliciosa podría crear una pantalla virtual con el Soporte de decoraciones del sistema habilitado y leer información sensible del usuario desde la superficie, como predicciones de tipeo y fondos personalizados.

Implementación

En Android 9 (y versiones anteriores), el IME solo estaba disponible en la pantalla predeterminada, como se describe en los métodos de entrada en pantalla . En Android 10 (y superior), un usuario puede cambiar entre diferentes campos de texto de entrada en diferentes pantallas cambiando el enfoque, y la ventana IME se mueve a las pantallas secundarias.

La implementación en WindowManager rastrea la ventana del método de entrada (la ventana IME donde se dibuja el teclado virtual) y el objetivo del método de entrada (la ventana donde va la entrada IME) para administrar el estado IME.

Para InputMethodManagerService (IMMS), ningún otro mecanismo incorporado puede propagar el cambio de pantalla a InputMethodService (IMS) y reconfigurar la distribución del teclado en tiempo de ejecución cuando se mueve el foco a otra pantalla.

Para lograr el cambio de ventana IME entre pantallas, Android 10 implementa lo siguiente:

  • El IME y la ventana de destino de entrada ahora se rastrean por pantalla en DisplayContent#mInputMethodWindow y DisplayContent#mInputMethodTarget , de modo que WindowManager (WM) puede administrar el estado de enfoque IME independientemente de cada pantalla.
  • En el lado de IMMS, cuando la solicitud de foco de un cliente de la aplicación desde la pantalla externa se recibe a través de ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus , primero desenlaza el servicio del método de entrada actual y luego vuelve a vincular el servicio para volver a conectar el nuevo IME token de ventana para la pantalla externa en onServiceConnected() .
  • En el lado de IMS, después de IMS#attachToken , se produce el siguiente flujo:
    • ContextImpl#updateDisplay se llama para actualizar la visualización del contexto de servicio en InputMethodService#attachToken() . Esto llama a ViewGroup#addView() para revisar el diseño del teclado y adaptarlo a la pantalla de destino comprobando el contexto actual.
    • Después de que se llama a DisplayContent#setInputMethodWindowLocked() , la implementación envía cambios de configuración de visualización a nivel de proceso utilizando WindowProcessController al proceso IME para anular recursos y mostrar métricas.
    • El cliente InputMethodService obtiene la configuración correcta con las métricas de visualización correctas después de onConfigurationChanged() y la ViewGroup#addView() para reinicializar la vista de entrada.

Compatibilidad con el Editor de métodos de entrada de sesiones múltiples

Las implementaciones de dispositivos con múltiples pantallas que se espera sean utilizadas simultáneamente por múltiples usuarios para proporcionar fuentes de entrada apropiadas se pueden configurar para mostrar simultáneamente editores de métodos de entrada múltiples (IME), como máximo uno por pantalla. Las siguientes dos figuras muestran un ejemplo de IME multisesión en dos pantallas:

Figura 2. Ejemplo de IME multisesión

Figura 3. Ejemplo de IME multisesión

La compatibilidad con el enfoque por pantalla es un requisito previo para esta función. Si no, esta característica no se puede habilitar. Debido a restricciones de seguridad, la limitación de foco por pantalla restringió esta función a un pequeño subconjunto de dispositivos.

En Android 10, el soporte para IME de sesiones múltiples se implementa con servicios de sistema separados con un conjunto diferente de API y funcionalidad reducida. El IME multisesión no es compatible con los IME existentes. Se puede usar el servicio de sesión múltiple o de sesión única, pero no ambos.

No es posible usar IME de Android existentes creados sobre la clase InputMethodService porque se asumió que un solo cliente de IME puede enfocarse al mismo tiempo antes de que se introdujeran las API de IME de Android en Android 1.5 y muchas API públicas en InputMethodService tienen Ya se basó en gran medida en esa suposición. Sin embargo, actualizar la clase InputMethodService para admitir un escenario InputMethodService es un desafío porque:

  1. Hacerlo introduciría una cantidad inaceptable de complejidad en InputMethodService , que ya es difícil de mantener.
  2. Los desarrolladores de IME aún necesitan actualizar su implementación para poder admitir solicitudes paralelas de múltiples clientes IME enfocados, lo que puede requerir un rediseño no trivial de su lado (como el decodificador de entrada y la base de datos del historial de escritura).
  3. Se espera que los casos de uso reales para clientes multi-IME evolucionen rápidamente, por lo que el nuevo protocolo no es estable y no está listo para exponerse como API públicas.

Al igual que con el IME de sesión única (regular), el control sobre la visualización de IME en pantallas individuales se realiza mediante DisplayWindowSettings .

Hay un ejemplo de IME multisesión ubicado en development/samples/MultiClientInputMethod .

Para probar el IME de varias sesiones:

  1. Establezca config_perDisplayFocusEnabled en true .
  2. Ejecute estos comandos:
    1. $ make -j MultiClientInputMethod
    2. $ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
    3. $ adb root
    4. $ adb shell setprop persist.debug.multi_client_ime \
      com.example.android.multiclientinputmethod/.MultiClientInputMethod
    5. $ adb reboot
  3. Pruebe múltiples escenarios de entrada de texto.

Implementación

Consulte MultiClientInputMethodManagerService para obtener detalles de implementación.