lunes, 10 de agosto de 2015

Introducción a Activity Starter

Utilizar el componente Activity Starter

El componente Activity Starter permite combinar aplicaciones permitiendo a una aplicación arrancar otras aplicaciones. Activity Starter está destinado principalmente para desarrolladores avanzados, pero es una forma clave para extender App Inventor, ya que permite aprovechar aplicaciones escritas por otros, tal vez creadas con otras plataformas de desarrollo.

Las aplicaciones iniciadas pueden ser aplicaciones de App Inventor creadas por usted u otras personas; aplicaciones tales como la que gestiona la cámara del dispositivo o mapas pre-instalados en el mismo, o cualquier otra aplicación, bien creada con App Inventor o no, siempre y cuando tenga la información necesaria para suministrar al motor de Activity Starter.

En aplicaciones bien diseñadas, se pueden pasar valores a las mismas al arrancarlas. También puede iniciar una aplicación y regresar desde la misma para un procesamiento posterior de los resultados que devuelve, siempre que esté diseñada con esta capacidad. Actualmente se pueden pasar y recibir, exclusivamente, valores de texto.

Para iniciar otra aplicación, debe proporcionar cierta información de control para el sistema operativo Android. Para ello, se deben establecer varias propiedades de Activity Starter antes de invocar la aplicación que deseamos iniciar. En esta sección se presentan algunos ejemplos.

Iniciando otra aplicación App Inventor desde su aplicación App Inventor

Usted puede iniciar otra aplicación que se creó con App Inventor si conoce el nombre del paquete y el nombre de la clase. Si tiene el código fuente de la aplicación, puede encontrar estos nombres de la siguiente manera: 
  1. Descargar el código fuente a su ordenador. 
  2. Mediante un explorador de archivos o una utilidad de descompresión, busque el archivo youngandroidproject/project.properties. 
  3. La primera línea comenzará con " main= ". Lo que aparece a continuación es el paquete y el nombre de clase. 
Por ejemplo, aquí hay una primera línea que puede ver de una aplicación llamada HelloPurr:

main=appinventor.ai_HomerSimpson.HelloPurr

La parte del nombre referente a HomerSimpson proviene de la cuenta de usuario App Inventor.

Para iniciar esta aplicación, se utiliza un componente Activity Starter con estas propiedades:
  • ActivityPackage: appinventor.ai_HomerSimpson.HelloPurr 
  • ActivityClass: appinventor.ai_HomerSimpson.HelloPurr.Screen1
Invocando el método StartActivity de Activity Starter se inicia el programa HelloPurr. Cuando finaliza HelloPurr (si lo hace), el método ActivityStarter.AfterActivity de la aplicación inicial (la que llamó a HelloPurr) será invocado.

Nota: Si usted va a iniciar otra aplicación App Inventor, asegúrese de usar el nombre del paquete correcto. Por ejemplo, si alguien publica el código fuente (archivo zip) para una aplicación, y vuelve a empaquetar esa aplicación, terminará con el nombre de un paquete diferente al que tenía. En caso de duda, o si usted no tiene el código fuente, iniciar la actividad con el teléfono y ejecutar "adb Logcat " para ver el registro del sistema Android y comprobar qué se inició en realidad, como se explica en "Averiguar cómo establecer las propiedades ".

Nota: Si usted quiere iniciar una segunda aplicación de App Inventor que usted está escribiendo, por lo general es más fácil y conveniente diseñar una aplicación única en pantalla múltiple, en lugar de crear dos aplicaciones por separado. Vea la sección sobre "Activity Starter versus aplicaciones de pantalla múltiple".

Iniciando una aplicación incorporada al teléfono desde su aplicación App Inventor

Las aplicaciones que vienen con el teléfono pueden ser invocadas con los nombres de paquete y los nombres de clase, como en el caso anterior. Las aplicaciones de Android también pueden ejecutarse como respuesta a una intención, que es la forma que existe en el sistema operativo Android de especificar algo que se pretende sin necesidad de designar a una aplicación en particular para realizarlo. Usted puede encontrar información acerca de las intenciones (para desarrolladores avanzados) en la documentación del sistema Android.

Algunas aplicaciones están diseñadas para recoger información adicional cuando se las pone en marcha. Por ejemplo, Maps puede requerir información geográfica adicional que especifica qué mapa mostrar. Otro ejemplo sería el lanzamiento de una búsqueda en Internet con información adicional que especifica el texto que se desea buscar. Usted debe consultar la documentación de la aplicación en particular para saber qué información adicional se requiere y cómo configurarla. En general, se especifica la información mediante el establecimiento de las propiedades de Activity Starter justo antes de lanzar la otra aplicación que se desea poner en marcha.

He aquí algunos ejemplos:

Inicio de la cámara
Para lanzar la aplicación de la cámara Android, utilice Activity Starter con las siguientes propiedades:
  • Action: android.intent.action.MAIN 
  • ActivityPackage: com.google.android.camera 
  • ActivityClass: com.android.camera.Camera
Esto es más o menos lo que el componente cámara de App Inventor hace, aunque es mucho más conveniente utilizar el componente de la cámara.

Poner en marcha una búsqueda en la Web
Para iniciar una búsqueda en Internet para una consulta determinada, como "Homer Simpson", utilice Activity Starter con las siguientes propiedades:
  • Action: android.intent.action.WEB_SEARCH 
  • ExtraKey: query 
  • ExtraValue: Homer Simpson 
  • ActivityPackage: com.google.android.providers.enhancedgooglesearch 
  • ActivityClass: com.google.android.providers.enhancedgooglesearch.Launcher
Abra el navegador a una página Web
Utilice estas propiedades de Activity Starter para abrir la página http://news.google.com:

Inicie el programa de correo para remitir un mensaje a una dirección de destinatario ya especificada
Para iniciar la aplicación de correo de Android, utilice la acción android.intent.action.VIEW. Puede utilizar la propiedad de Activity Starter DataUri para especificar el destinatario, el asunto, y el cuerpo del mensaje. En ese caso, al iniciarse la actividad se abrirá el cliente de correo Android, donde se puede completar el mensaje y pulsar luego el botón "Enviar".

Por ejemplo, si se especifica:
  • Action: android.intent.action.VIEW 
  • DataUri: mailto:santa@northpole.com
a continuación, al iniciar la actividad se abrirá el gestor de correo, con el destinatario especificado antes.

Si se especifica:
  • Action: android.intent.action.VIEW 
  • DataUri: mailto:santa@northpole.com?subject=Por favor Santa&body;=Tráeme un pony
a continuación, al iniciar la actividad se abrirá el gestor de correo, con el destinatario, asunto y el cuerpo lleno. Usted puede utilizar el software de correo para editarlos antes de enviar el mensaje, si lo desea.

El DataURI debe ser un mensaje codificado como URL, diseñado para funcionar con el servicio de internet mailto. Puede buscar en la Web para encontrar la documentación apropiada y las herramientas para la creación de estos mensajes, por ejemplo: Elementos de un mailto: URL

Mostrar el mapa de un lugar

Si conoce la latitud y longitud de un lugar, puede mostrar un mapa mediante un Activity Starter con estas propiedades, para mostrar un mapa de la zona:
  • Action: android.intent.action.VIEW 
  • DataUri: geo:37.8,-122.23?z=23
El formato de DataURI es específico de la aplicación. En este ejemplo, el URI especifica una z (zoom) de 23, que es el valor más grande de zoom. El valor de Zoom es opcional y va desde 1 (toda la Tierra) a 23.

Si conoce el código postal, puede establecer las propiedades de Activity Starter de la siguiente manera:
  • Action: android.intent.action.VIEW 
  • DataUri: geo:0,0&q=94043
Si dispone de una dirección, puede utilizar un DataUri que codifica la dirección con un procedimiento denominado codificación de direcciones URL :
  • Action: android.intent.action.VIEW 
  • DataUri: geo:0,0&q=5000% 20MacArthurBlvd%20Oakland%2CCA
En general, para codificar la URI sólo se tienen que sustituir los espacios ( %20 ) y los signos de puntuación, como las comas ( %2C ) y el punto ( %2E ).

Reproducir un vídeo de YouTube

Usted necesita saber la dirección URI del vídeo de YouTube. A continuación, establezca las propiedades de Activity Starter del siguiente modo:
  • Action: android.intent.action.VIEW 
  • ActivityPackage: com.google.android.youtube 
  • ActivityClass: com.google.android.youtube.PlayerActivity
y establecer la propiedad DataUri a la URI del vídeo que desea reproducir, por ejemplo:

DataUri: http://www.youtube.com/watch?v=8ADwPLSFeY8

Averiguar cómo establecer las propiedades

Si usted no puede encontrar la documentación de las actividades que se quieren iniciar, una forma de encontrar la manera de establecer las propiedades es poner en marcha la actividad de forma manual y mirar lo que aparece en el registro del sistema Android (el logcat, que puede verse con la aplicación Catlog, por ejemplo, y con muchas otras). Por ejemplo, si utiliza YouTube para reproducir un vídeo, podrás ver en el registro de:

I/ActivityManager( 86): Starting activity: Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=http://www.youtube.com/watch?v=8ADwPLSFeY8 flg=0x3800000 cmp=com.google.android.youtube/.PlayerActivity }

Si usted puede encontrar la cadena "cmp =", entonces ActivityPackage deberá corresponderse con la cadena de antes de la barra, y ActivityClass es toda la cadena tras "cmp =", sin el carácter de barra. Como en el ejemplo de YouTube, puede haber también información "dat =", que se puede especificar con la propiedad DataUri.

Arrancando aplicaciones arbitrarias

Usted puede utilizar Activity Starter para iniciar cualquier actividad si conoce el nombre del paquete y el nombre de la clase, o la intención adecuada. Algunos desarrolladores documentan las intenciones en beneficio de otros desarrolladores de Android. Para obtener sugerencias sobre cómo iniciar otras aplicaciones que utilizan intenciones, consulte la documentación de la API de Android o busque en los foros de desarrolladores de Android.

Si usted tiene una aplicación en su teléfono y usted no tiene el código fuente, es posible que aún pueda conocer el nombre del paquete y el nombre de la clase (y en ocasiones la intención) con el lanzamiento de la aplicación y la inspección del registro del sistema Android, tal como se indicó en el apartado anterior.

Recepción de los resultados de las aplicaciones que se inician


Algunas aplicaciones son construidas para devolver un resultado. Usted puede ver ese resultado como el argumento result del evento AfterActivity de Activity Starter. En la actualidad, App Inventor puede recibir resultados de texto únicamente.

Devolviendo resultados desde la aplicación de App Inventor, y obteneniendo los resultados
Usted puede crear aplicaciones de App Inventor que devuelven un resultado (de texto) a sus interlocutores, por lo que se pueden usar como subrutinas. Para devolver un resultado, invocar el comando close screen with plain text (que se encuentra en el cajón de control). Su aplicación de tipo subrutina terminará, y el argumento de close screen with plain text estará disponible para la aplicación que lo llamó. Si la aplicación llamante es una aplicación de App Inventor que, a su vez, utiliza Activity Starter, verá aquel texto como argumento del evento AfterActivity de Activity Starter.

Concretando, supongamos que hay dos aplicaciones de App Inventor: Una SubroutineApp diseñada para ser iniciada con un Activity Starter y devolver un valor, y otra CallerApp que utiliza un ActivityStarter para llamar a SubroutineApp . Para devolver el resultado, SubroutineApp ejecuta close screen with plain text , dándole como argumento el resultado (sólo texto), que debe ser devuelto a la persona que llama.

En cuanto a las llamadas, CallerApp establece su Activity Starter con el nombre del paquete y el nombre de la clase correcta para el inicio de SubroutineApp. También debe establecer la propiedad ActivityStarter.ResultName como la cadena de texto especial APP_INVENTOR_RESULT . Entonces CallerApp inicia SubroutineApp actividad. Cuando finaliza la subrutina, el evento AfterActivity de Activity Starter se dispara, y el resultado que se ha pasado de vuelta de SubroutineApp estará disponible como el argumento result de AfterActivity . Esa misma información está disponible como la propiedad Result de ActivityStarter.

Llamando aplicaciones App Inventor y pasándoles valores
Si usted está escribiendo una App Inventor CallerApp para llamar a una App Inventor SubroutineApp , usted puede pasar un valor de texto a SubroutineApp . Para ello, utilice un Activity Starter en CallerApp con la propiedad ExtraKey para establecer la etiqueta especial APP_INVENTOR_START y el conjunto de propiedades ExtraValue con el texto que desea pasar. La SubroutineApp puede recuperar ese valor mediante el get start plain text del bloque de la caja de control.

Al pasar y devolver los resultados, puede combinar varias aplicaciones de App Inventor, tanto aplicaciones escritas, como las aplicaciones compartidas con otros.

Devolviendo resultados desde aplicaciones arbitrarias
Obtener valores desde otras aplicaciones es como obtenerlos desde aplicaciones App Inventor. En general, en Android, una actividad devuelve un resultado que es designado por un nombre, especificándose el nombre con la propiedad ResultName de Activity Starter. El nombre que se utilizará para aplicaciones de App Inventor es APP_INVENTOR_RESULT , como se describió anteriormente. Otras aplicaciones que no se crearon con App Inventor utilizan otros nombres, y usted necesita saber dichos nombres con el fin de obtener los valores de vuelta de esas aplicaciones. En general, tendrá que consultar la documentación sobre la aplicación que desea utilizar como una subrutina. Algunos desarrolladores proporcionan esta información, o, a veces usted tendrá acceso al código fuente.

No todas las aplicaciones utilizan los mecanismos Result y ResultName. Por ejemplo, algunas aplicaciones devuelven información a través de las propiedades ResultType y ResultUri . Una vez más, tendrá que disponer de información proporcionada por el desarrollador de la aplicación para saber cómo obtener los valores de retorno.

Para desarrolladores avanzados: Más específicamente (con referencia a la documentación de desarrolladores de Android) una aplicación puede ser diseñada para devolver una intención. El motor de arranque utiliza la actividad especificada ResultName de acceso intent.getStringExtra(resultName) para producir el resultado. Los valores de ResultType y ResultUri provienen de intent.getType() y intent.getType() .


Ejemplo: Escoger los archivos de la tarjeta SD
He aquí un ejemplo que ilustra el uso de aplicaciones de terceros:

AndExplorer de Lysesoft es una aplicación que permite elegir ficheros de la tarjeta SD. Usted puede llamar a AndExplorer con un Activty Starter para añadir una capacidad de recolección de archivos en su aplicación. Necesitará tener AndExplorer instalado en el teléfono. Se puede obtener en Google Play Store.

Para iniciar AndExplorer para seleccionar un archivo, utilice un ActivityStarter con:
  • Action: android.intent.action.PICK 
  • dataType: vnd.android.cursor.dir/lysesoft.andexplorer.file 
  • dataURI: file:///sdcard
Al iniciar la actividad y seleccionar un archivo, el nombre del archivo estará disponible como ResultUri . Además, ResultType dará el tipo de archivo, por ejemplo, image/jpeg o audio/mpeg. Así, se puede escribir una aplicación que permita elegir un archivo desde la tarjeta SD y, bien mostrar la imagen o reproducir la pista de audio, en su caso.

¿Está la aplicación disponible?

Si su aplicación llama a otras aplicaciones como actividades, tendrá que comprobar que las otras aplicaciones se encuentran disponibles en el teléfono del usuario antes de tratar de llamarlas. Usted puede comprobar esto utilizando el método ResolveActivity de Activity Starter, que devuelve el nombre de la actividad que se desea iniciar dado el paquete o la información de intención que usted le ha facilitado. Si el nombre está en blanco, la aplicación requerida no está presente, y puede advertir al usuario.

Activity Starter frente a la utilización de múltiples pantallas

Las secciones anteriores explican cómo se puede crear una aplicación de App Inventor que llama a otra aplicación App Inventor, tal vez con el paso y retorno de valores de texto. Si va a escribir ambas aplicaciones, es probable que sea mejor hacer una sola aplicación de multipantalla en lugar de crear dos aplicaciones y utilizar Activity Starter. Esto simplificará las cosas para sus usuarios, ya que será necesario instalar sólo una aplicación en el dispositivo. Además, con aplicaciones múltipantalla, puede pasar y devolver listas como valores en lugar de sólo texto, y puede compartir valores entre las pantallas con TinyDB. Consulte la documentación de las aplicaciones múltipantalla para obtener más detalles.

Nota para mejorar aplicaciones antiguas

Los comandos de iniciación de actividades descritos aquí han cambiado desde versiones anteriores, que usaban close screen with result y get start text , en lugar de la nueva close screen with plain text y get start plain text . Si se carga la fuente de una aplicación de antes de 2012 con release 66, App Inventor marcará los viejos bloques y le requerirá sustituirlos por su nueva versión.


Otros enlaces: 

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.