¿Cómo utilizar la nueva función de Android M de "Selección de texto" que se ofrece desde fuera de la aplicación?

Fondo

Android M presenta una nueva forma de manejar el texto seleccionado (enlace aquí ), incluso desde fuera de su aplicación. La selección de texto se puede manejar como tal:

Introduzca aquí la descripción de la imagen

Sé que es posible manejar el texto seleccionado desde fuera de la aplicación, porque si voy al navegador web (o cualquier otro lugar que permita la selección de texto), puedo ver que puedo usar la aplicación "demos API" para manejar el archivo seleccionado texto.

El problema

No puedo ver mucha información sobre cómo hacerlo.

La pregunta

  1. ¿Qué se debe agregar en el código (y el manifiesto) para poder manejar el texto seleccionado desde fuera de la aplicación?
  2. ¿Es posible limitar la selección a ciertos tipos de textos? Por ejemplo, ¿ofrecer para mostrar la aplicación sólo si el tipo de texto es un número de teléfono válido?

En primer lugar, para aclarar la pregunta: En un emulador M, si resalta texto, verá el nuevo modo de acción flotante. Si hace clic en el icono de desbordamiento, aparecerá "API DEMOS":

M Developer Preview Emulator

Al hacer clic en esta opción, se muestra una actividad de la aplicación API Demos, que muestra el texto resaltado:

Otro M Developer Preview Emulator

Al reemplazar el valor en el campo y al hacer clic en el botón, se coloca el texto de reemplazo como reemplazo de lo que haya resaltado.


ADVERTENCIA : La explicación siguiente es de inspeccionar el código de demostraciones API y la documentación de M Developer Preview. Es muy posible que esto cambie antes de que M envíe para realz. YMMV, a menos que utilice el sistema métrico, en cuyo caso YKMV.

La actividad en cuestión, que recibe el texto, admite ACTION_PROCESS_TEXT como acción de Intent . EXTRA_PROCESS_TEXT guardará algún texto, o EXTRA_PROCESS_TEXT_READONLY lo mantendrá si el texto es de sólo lectura. La actividad se invocará a través de startActivityForResult() . El resultado Intent puede tener su propio valor EXTRA_PROCESS_TEXT , que será el texto de reemplazo.

Por lo tanto, a las preguntas específicas:

¿Qué se debe agregar en el código (y el manifiesto) para poder manejar el texto seleccionado desde fuera de la aplicación?

Véase más arriba. Tenga en cuenta que la actividad de API Demos ( ProcessText ) tiene este <intent-filter> :

  <intent-filter > <action android:name="android.intent.action.PROCESS_TEXT"/> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> 

La documentación no describe un tipo MIME. No he realizado ningún experimento para determinar si se requiere el tipo MIME, y qué más podemos obtener ( text/html para cosas que tiene spans?).

¿Es posible limitar la selección a ciertos tipos de textos? Por ejemplo, ¿ofrecer para mostrar la aplicación sólo si el tipo de texto es un número de teléfono válido?

Eso no parece ser posible dada la documentación. Dicho esto, es ciertamente una idea razonable (por ejemplo, anunciar un regex, o múltiples regexes, a través de metadatos en el manifiesto que el texto debe coincidir).

Este artículo en el blog de desarrolladores de Android puede ser relevante. Describe cómo se puede agregar la opción Google Traductor al menú de selección de texto de desbordamiento.

Las aplicaciones de Android que utilizan el comportamiento de selección de texto de Android ya tendrán activada esta función, por lo que no es necesario tomar medidas adicionales. Los desarrolladores que crearon un comportamiento de selección de texto personalizado para sus aplicaciones pueden implementar fácilmente esta característica siguiendo los siguientes pasos:

Escanear a través de PackageManager a través de todos los paquetes que tienen el filtro de intención PROCESS_TEXT (por ejemplo: com.google.android.apps.translate – si está instalado) y agregarlos como MenuItems a las selecciones de TextView para su aplicación

Para consultar el gestor de paquetes, primero construya una intención con la acción Intent.ACTION_PROCESS_TEXT , luego recupere las actividades soportadas y añada un elemento para cada actividad recuperada y asigne una intención para iniciar la acción

 public void onInitializeMenu(Menu menu) { // Start with a menu Item order value that is high enough // so that your "PROCESS_TEXT" menu items appear after the // standard selection menu items like Cut, Copy, Paste. int menuItemOrder = 100; for (ResolveInfo resolveInfo : getSupportedActivities()) { menu.add(Menu.NONE, Menu.NONE, menuItemOrder++, getLabel(resolveInfo)) .setIntent(createProcessTextIntentForResolveInfo(resolveInfo)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } } 
  • No apuntar a las últimas versiones de Android
  • OnCreate () no está siendo llamado
  • ¿Cuál es la sintaxis correcta para definir una actividad en el archivo de manifiesto
  • "Tag <Activity> nombre de atributo tiene un carácter no válido". "Android Mainfest
  • Cómo evitar que la aplicación se ejecute en tablets Android
  • ¿Cuál es la diferencia entre la configuración de 'destino' en el archivo 'project.properties' y la etiqueta 'android: targetSdkVersion' en el manifiesto?
  • Androide. Bloquear la orientación de la pantalla para todas las actividades
  • El banner de instalación de la aplicación no funciona
  • Cómo manejar varias clases de aplicación en android
  • Mi aplicación no aparece en las tablas
  • ¿Por qué mi aplicación no es compatible con nexus 7 en Google Play?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.