Archive for the ‘10.1’ Category

Flash Player 10.1 en Android 2.2 y Android Apps en AIR

Jueves, Mayo 20th, 2010

Todos lo sabían, pero sigue siendo una gran noticia. Android tendrá instalado por defecto Flash Player 10.1 y podrá reproducir, tal como funciona en un desktop, todos los sitios y aplicaciones hechas en Flash o Flex. Nada del bullshit de Steve Jobs. Flash corre perfecto en dispositivos móviles touch, no es un "drenador" de batería y no requiere recodear toda la web. Simplemente funciona.

Apps nativas hechas en Flash en el market de Android

En el sandbox muestran también varias apps nativas de Androids que se instalan desde el market, pero que fueron construidas con Flash y compiladas con AIR. Tal como funcionaba el compilador para iPhone, un developer puede crear una app en Flash y ponerla en el market de Android, la Ovi Store de Nokia o el Market de Blackberry.

Para el usuario, ambas experiencias son nativas y transparentes. Para los desarrolladores, la vida es más fácil.

Enviar comentario

Google TV

Jueves, Mayo 20th, 2010

Google TV fue anunciado hoy en el Google I/O 2010. Es una "caja" que se integra con el TV, el cable y todo tu sistema de entretenimiento y añade una caja de busqueda, la web entera y el sistema operativo Android de manera transparente a la televisión. El código de Google TV es open source.

Lo realmente revolucionario es que funciona.

Televisión + Busqueda

El primer cambio es simbólico para Google. Una caja de búsqueda en el TV cambia la forma y la usabilidad de la televisión. Puedes poner el nombre de un canal y te lo cambia. El de un show y te lo pone en el canal que esté. Si no está en vivo, te lleva a la web para verlo en demanda donde lo encuentre.

La web completa: Android + Chrome + Flash

Google TV trae un navegador completo (Chrome con Flash 10.1) con lo que es posible usar Youtube, Hulu, Youporn, Amazon OnDemand, Netflix o lo que sea. Completamente integrado con la televisión.

Antes podías hacerlo con Boxee y un par de hacks, pero no tan fácil como Google TV. Y definitivamente superior a como Apple TV lo hace.

Un teclado o un Android o?

La idea es reemplazar el control remoto de tu TV con uno de los muchos controles "universales" creados para Google TV. Controlan todo tu TV, pero también dan un teclado y acceso total a la web completa. Eso puede ser un punto en contra, pero si el uso se masifica, será natural comprar un Televisor que diga "GoogleTV Ready".

O puedes usar Android. Google empujó en el I/O 2010 mucho el uso de Android. Si tienes un teléfono con Android, puedes simplemente decirle "cnn" por voz y el canal cambiará. Control completo por voz o touch con el teléfono.

En teoría, el protocolo de control de Google TV es abierto, así que quizás pueda haber una app para iPhone que controle Google TV. Eso es si Apple lo aprueba.

Youtube Leanback y rentals

Corto y rápido. Google cree que sabe lo que te gustaría, así que creo Youtube Leanback. Un algoritmo detecta tus costumbres y videos más vistos y reproduce automáticamente videos que el algoritmo asume que te gustarán. Igualmente, Youtube lanzó la posibilidad de rentar películas y series, que podrás ver en la app de Youtube de Google TV.

Tienda de aplicaciones para tu TV

Al igual que Android, Google TV tiene un market de aplicaciones instalables en el TV. Apps especializadas de Netflix, FOX y demás para dar una interfaz mucho más optimizada que un sitio web y así acceder a contenido por demanda.

Las apps moviles de Android funcionan en Google TV también. Igual que las apps de iPhone funcionan en iPad. Ligeramente "escaladas", pero funcionan. Tienes Android entero en tu TV.

¿Te interesa?

Funciona, es lindo. Pero claramente está enfocado al mercado gringo inicialmente. Yo uso un laptop conectado a Boxee para hacer algo muy similar a Google TV, pero gratis y ya mismo. Google TV tiene Android, Youtube y lo más importante, la caja de búsqueda. Falta ver precios y detalles, pero ¿Te interesa? ¿Lo comprarías?

Enviar comentario

Adobe abandona iPhone en Flash, se enfoca en Android

Miércoles, Abril 21st, 2010

Mike Chambers, manager de Flash Platform en Adobe, anunció hoy en su blog que Adobe dejará de invertir en herramientas para desarrollo orientado al iPhone de Apple. No es una sorpresa, pero es la posición oficial de Adobe frente a Apple y su prohibición de apps hechas en Flash dentro de la App Store.

Android, el futuro para Adobe

Además, anuncian que Android será la plataforma móvil donde se dirigirán sus esfuerzos. Hablando del Motorola Droid, el Nexus One y la tabla Android con NVIDIA Tegra, futura competidora del iPad.

Hablan de otros sistemas operativos móviles, pero el enfoque clave del artículo es en Andoid.

Adobe reitera lo cerrado de Apple, se compromete con "open"

Recuerdan además que Apple no sólo ha restringido el desarrollo de apps para iPhone con herramientas de terceros, sino también el uso de otras redes de publicidad (como AdSense) diferentes a las propias de Apple, así como su ilógico sistema de rechazo de apps por contenido.

Cierra el artículo Mike asegurando que "las plataformas abiertas le ganarán al final a aquellas cerradas y controladas que Apple quiere crear", recordando que Adobe AIR y Flash Player 10.1 permitirá crear apps nativas para Android, Palm, Windows Phone 7, Symbian y Blackberry.

Lo que me deja esperando que ponga su dinero donde sus palabras están. Que abran el Flash Player como open source, igual que Flex. Ya es hora.

Enviar comentario

Enviar y recibir datos UDP con Adobe AIR 2.0

Miércoles, Marzo 3rd, 2010

En este tip, aprenderemos a enviar información a través de UDP (Universal Datagram Protocol) que es una nueva característica de Adobe AIR 2.0 que nos permitirá enviar y recibir datos, que al ser UDP no garantiza la recepción o entrega, ya que sus cabeceras no llevan el control de datos haciendo ligero los envíos. Al ser así, se puede usar esta nueva característica para aplicaciones con baja latencia y donde la perdida de datos sea indiferente. Por ejemplo puedes utilizar esto con aplicaciones en tiempo real o juegos multiplayer, ejemplos o utilidades pueden haber miles, depende mucho del análisis que hagas.

Para este ejemplo, como ya saben, necesitan tener Flash Builder o eclipse con el SDK de AIR 2.0. De la misma forma puedes ver los anteriores tips que escribí para que te sientas familiarizado con Adobe AIR.

Usaremos la clase DatagramSocket y para eso crearemos una instancia de esta clase. Asimismo, tendremos una variable con la dirección IP que usaremos para la conexión. En este ejemplo usaré la dirección local de mi computador, puedes poner IP de máquinas en tu red y usar el ejemplo en más de un computador.

Código :

private var $__datagramSocket:DatagramSocket;
private var $__IP:String = "127.0.0.1";

Cuando la aplicación se inicie crearemos el constructor de la clase DatagramSocket, agregando un escuchador que permita detectar cuando un mensaje fue recibido:

Código :

$__datagramSocket = new DatagramSocket();
$__datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived, false, 0, true );

Adicional a esto el método bind() nos permite establecer la conexión entre el puerto que usaremos y la dirección IP que servirá para dicha conexión. El método receive() es quien nos permite iniciar la escucha de los datos enviados.

Código :

$__datagramSocket.bind( 55555, $__IP );
$__datagramSocket.receive();

El método que usaremos para escuchar cuando los datos lleguen es dataReceived:

Código :

private function dataReceived( event:DatagramSocketDataEvent ):void{
   campo.text = campo.text + "nOtro dice: " + event.data.toString();
}

Para este tip, crearemos un ejemplo básico de chat enviando texto y mostrando la información de otro usuario. Para eso crearemos la siguiente interfaz:

Código :

<s:Label text="Chat:" width="200"  fontWeight="bold"/>
<s:TextArea width="200" height="200" id="campo" text="...INICIA CHAT..." 
         verticalAlign="bottom" editable="false"/>
<s:Label text="Enviar:" width="200"  fontWeight="bold"/>
<s:TextInput id="txtInput" width="200"
          click="{txtInput.text = ''}"
          keyDown="send(event)"
          text="Escribe aqu’ y presiona enter" />

Como ven en el código, al presionar una tecla llamará al método send, nosotros validaremos que sea con ENTER:

Código :

private function send( e:KeyboardEvent = null ):void
{
   if( e.keyCode == Keyboard.ENTER ){
      var data:ByteArray = new ByteArray();
      data.writeUTFBytes(txtInput.text);

      $__datagramSocket.send( data, 0, 0, $__IP, 55554);

      campo.text = campo.text + "nTu dices: " + txtInput.text;
      txtInput.text = "";
   }
}

Es necesario aclarar que los puertos donde se conectarán deben estar libres y no siendo utilizados incluso por varias de esta misma app, además de tener permisos de seguridad. Aquí te dejo el código completo de la app que hice, es sólo un demo pero creo que sirve como base para que puedas crear cosas impresionantes.

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  creationComplete="init()"
                   width="236" height="300">
   <s:layout>
      <s:VerticalLayout horizontalAlign="center" paddingTop="10"/>
   </s:layout>

   
   <fx:Script>
      <![CDATA[
         
         private var $__datagramSocket:DatagramSocket;
         private var $__IP:String = "127.0.0.1";
         
         private function init():void{
            
            $__datagramSocket = new DatagramSocket();
            $__datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived, false, 0, true );
            $__datagramSocket.bind( 55555, $__IP );
            $__datagramSocket.receive();
         }
         
         private function dataReceived( event:DatagramSocketDataEvent ):void{
            campo.text = campo.text + "nOtro dice: " + event.data.toString();
         }
         
         private function send( e:KeyboardEvent = null ):void
         {
            if( e.keyCode == Keyboard.ENTER ){
               var data:ByteArray = new ByteArray();
               data.writeUTFBytes(txtInput.text);
               
               $__datagramSocket.send( data, 0, 0, $__IP, 55554);
               
               campo.text = campo.text + "nTu dices: " + txtInput.text;
               txtInput.text = "";
            }
         }
         
      ]]>
   </fx:Script>
   
   <s:Label text="Chat:" width="200"  fontWeight="bold"/>
   <s:TextArea width="200" height="200" id="campo" text="...INICIA CHAT..." 
            verticalAlign="bottom" editable="false"/>
   <s:Label text="Enviar:" width="200"  fontWeight="bold"/>
   <s:TextInput id="txtInput" width="200"
             click="{txtInput.text = ''}"
             keyDown="send(event)"
             text="Escribe aqu’ y presiona enter" />
   
</s:WindowedApplication>

Puedes descargar el demo aquí

Enviar comentario

Acceder a dispositivos de almacenamiento en AIR 2.0

Viernes, Febrero 26th, 2010

Este es uno de los tips de Adobe AIR 2.0 que más me agradó preparar, porque en realidad tenía la necesidad, en un proyecto, de acceder a dispositivos de almacenamientos para leer, editar y grabar información. La clase StorageVolume nos permite leer todos los archivos existentes en nuestro dispositivo de almacenamiento, reconociendo los permisos de los archivos, si son de sistema o no, etc. Por otro lado podemos crear y eliminar directorios, así como también archivos: moviendo, copiando, etc. Recuerda que debes tener Adobe AIR 2.0 configurado en tu Flash Builder o Eclipse

Entonces para este tip, haremos una básica aplicación que permita reconocer cuando se insertó o removió un dispositivo de almacenamiento. Empezaremos creando la interfaz:

Código :

<s:Label id="msg" width="100%" y="20" text="inserta un USB drive" 
          verticalAlign="top" textAlign="center"
          color="#110E91" fontWeight="bold"/>
<mx:Box id="boxContent" width="90%" height="126" x="20"  y="40"/>

Ahora crearemos nuestros listener que estén pendientes de cuando el dispositivo sea agregado o retirado, para eso usaremos una función que será ejecutada al iniciar la aplicación:

Código :

private function init():void{
   StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_MOUNT, mount, false, 0, true);
   StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_UNMOUNT, unMount, false, 0, true);
}

Y escribimos ahora las funciones que nos avisará en el campo de texto:

Código :

private function mount(e:StorageVolumeChangeEvent):void{
   var myDrive:StorageVolume = e.storageVolume;
   msg.text = "Se conectó: "+ myDrive.name + "  Size: "+Math.round( (myDrive.rootDirectory.spaceAvailable /1073741824) *100)/100 +" Gb";
}
         
private function unMount(e:StorageVolumeChangeEvent):void{
   msg.text = "Se removió: "+ e.rootDirectory.nativePath;
}

Si conectamos un dispositivo:

Si retiramos el dispositivo:

Vemos que nuestro evento StorageVolumeChangeEvent nos avisa cuando un dispositivo fue agregado o removido, este a su vez, nos envía información importante como por ejemplo el nombre, el espacio disponible, que tipo es ("FAT", "NTFS", "HFS" o "UFS"), etc. Pero lo más importante es poder acceder a los archivos que contiene.

Reconocer los archivos

En realidad hasta aquí es el tip de acceso a dispositivos de almacenamiento, pero decidí ampliarlo un poco más reconociendo los archivos que contiene, para eso usaremos la propiedad rootDirectory y recorreremos el dispositivo usando el método getDirectoryListing().

Usaré una función que nos haga el trabajo de reconocer los directorios (carpetas) y archivos para poder guardarlos en un arreglo y usarlo después:

Código :

private var $__arrFile:Array = new Array();

private function readDrive( files:File ):void{
   var arr:Array = files.getDirectoryListing();
   for each (var f:File in arr){
      if (f.isHidden == false){
         if (f.isDirectory){
            trace("Directorio", f.name);
         }else{
            trace("archivo", f.name );
            $__arrFile.push(f);
         }
      }
   }
}

Listo!!!, tenemos guardado en el arreglo todos los archivos que podemos acceder.

¿Y ahora?

Ya tenemos los archivos del dispositivo y podemos basarnos en el anterior tip que hice de Abrir archivos con Adobe AIR 2.0, creando una lista y abriendo con la aplicación por defecto cada file.

Nos valdremos de un componente creado en Flex para poder colocar el nombre del archivo y su id del array. Lo llamaremos MyBox.mxml.

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
       xmlns:s="library://ns.adobe.com/flex/spark"
       xmlns:mx="library://ns.adobe.com/flex/mx"
       creationComplete="init()"
       width="200" height="20">
   <s:Label x="10" y="5" width="180" height="15"
          id="campo" buttonMode="true"/>
   
   <fx:Script>
      <![CDATA[
         public var idBox:int;
         
         private function init():void{
            this.addEventListener(MouseEvent.MOUSE_OVER, mouseEvent, false, 0, true);
            this.addEventListener(MouseEvent.MOUSE_OUT, mouseEvent, false, 0, true);
         }
         
         public function setLabel(myText:String):void{
            if(myText.length>=20)
               myText = myText.substr(0,15)+"..."+myText.substr(myText.length-4,4);
            campo.text = myText
         }
         
         private function mouseEvent(e:MouseEvent):void{
            if(e.type == MouseEvent.MOUSE_OVER)
               this.alpha = 0.2;
            else
               this.alpha = 1;
         }
      ]]>
   </fx:Script>
   
</s:Group>

Volvemos a nuestra aplicación y creamos una función que utilice el componente MyBox y haga la lista:

Código :

private function createList():void{
   for (var i:int = 0; i< $__arrFile.length; i++) {
      var box:MyBox = new MyBox();
      box.setLabel( $__arrFile[i].name );
      box.y = 30*i;
      box.idBox = i;
      box.addEventListener(MouseEvent.CLICK, go, false, 0, true);
      boxContent.addElement(box);
   }
}

He creado un listener de Mouse que llama al evento go, que abrirá el archivo con su aplicación por defecto:

Código :

private function go(e:MouseEvent):void{
   var tmp:File = ($__arrFile[e.currentTarget.idBox] as File);
   tmp.openWithDefaultApplication();
}

Y con eso tenemos ya nuestra aplicación funcionando, reconociendo los archivos de tu dispositivo de almacenamiento y al dar click abrir el archivo.

Ingresamos un dispositivo:

Hacemos click a un elemento de la lista, por ejemplo al SWF:

Eso es todo, quería hacer los thumb pero creo que ya salía un poco del tip, pero haré otro con eso :P Aquí les dejo el código completo:

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  creationComplete="init()"
                  width="300" height="200">

   <fx:Script>
      <![CDATA[
         
         private var $__arrFile:Array = new Array();
         
         private function init():void{
            StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_MOUNT, mount, false, 0, true);
            StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_UNMOUNT, unMount, false, 0, true);
         }
      
         private function mount(e:StorageVolumeChangeEvent):void{
            var myDrive:StorageVolume = e.storageVolume;
            msg.text = "Se conectó: "+ myDrive.name + "  Size: "+Math.round( (myDrive.rootDirectory.spaceAvailable /1073741824) *100)/100 +" Gb";
            readDrive( myDrive.rootDirectory );
         }
         
         private function unMount(e:StorageVolumeChangeEvent):void{
            msg.text = "Se removió: "+ e.rootDirectory.nativePath;
         }
         
         private function readDrive( files:File ):void{
            var arr:Array = files.getDirectoryListing();
            for each (var f:File in arr){
               if (f.isHidden == false){
                  if (f.isDirectory){
                     trace("Directorio", f.name);
                  }else{
                     trace("archivo", f.name );
                     $__arrFile.push(f);
                  }
               }
            }
            createList();
         }
         
         private function createList():void{
            for (var i:int = 0; i< $__arrFile.length; i++) {
               var box:MyBox = new MyBox();
               box.setLabel( $__arrFile[i].name );
               box.y = 30*i;
               box.idBox = i;
               box.addEventListener(MouseEvent.CLICK, go, false, 0, true);
               boxContent.addElement(box);
            }
         }
         
         private function go(e:MouseEvent):void{
            var tmp:File = ($__arrFile[e.currentTarget.idBox] as File);
            tmp.openWithDefaultApplication();
         }
      ]]>
   </fx:Script>
   
   <s:Label id="msg" width="100%" y="20" text="inserta un USB drive" 
          verticalAlign="top" textAlign="center"
          color="#110E91" fontWeight="bold"/>
   <mx:Box id="boxContent" width="90%" height="126" x="20"  y="40"/>
   
</s:WindowedApplication>

Pueden descargar la aplicación aquí.

Enviar comentario

Control de errores globales en Adobe AIR 2.0

Miércoles, Febrero 24th, 2010

En muchas ocasiones cuando trabajamos con aplicaciones pueden aparecer errores no controlados o inesperados, que muchas veces podemos controlar, pero otras fueron realmente imprevistos. Para eso la nueva versión de Adobe AIR implementa un controlador de errores globales (usando AIR 2.0 y FlashPlayer 10.1), con lo cual NO QUIERE DECIR que, nosotros, los desarrolladores no prestemos importancia al control de errores, sino que será una previsión en caso de no entender porque existió un error desconocido. Por ejemplo, podemos usar la clase UncaughtErrorEvent para detectar un error imprevisto y este ser enviado vía email o al servidor para que nosotros lo solucionemos.

Para empezar, como en los demás tips que escribí, usaremos Flash Builder y el SDK de AIR 2.0.

Primero crearemos la interfaz, un botón que obligue al error y un textArea que nos muestre los mensajes:

Código :

<s:Button id="btn" label="Disparar Error"
           click="viewError(event)"
           horizontalCenter="0" top="10"/>
<s:TextArea  id="txtResp"
           horizontalCenter="0" top="40" width="80%" height="160"
           verticalAlign="top" textAlign="left" color="#FF0000"/>

Ahora utilizaremos la clase UncaughtErrorEvent que nos permite controlar los errores globales.

Código :

loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, captureError );

Cabe resaltar que podemos controlar errores del propio main de la aplicación, así como otros generados desde swf externos utilizando:

  • LoaderInfo.uncaughtErrorEvents
  • Loader.uncaughtErrorEvents

Estos deben ser escuchados desde el SWF principal ;)

Siguiendo con el ejemplo, nuestro botón llamará a una función que nos genere el error:

Código :

private function viewError(e:Event):void{
   var foo:String = null;
   trace(foo.length);
}

Este error será escuchado por el evento UncaughtErrorEvent y ejecutará nuestra función captureError:

Código :

private function captureError(e:UncaughtErrorEvent):void{
   txtResp.text = "CaptureError";
   if (e.error is Error){
      var error:Error = e.error as Error;
      txtResp.text +=   "nnError ID: " + error.errorID +
                        "nnError Name: " + error.name +
                        "nnError Message:n" + error.message
   }else{
      var errorEvent:ErrorEvent = e.error as ErrorEvent;
      txtResp.text += "n" + errorEvent.errorID
   }
}

Es una gran ventaja el uso de esta clase, ya que nos permite no sólo poder conocer, vía email por ejemplo, de algún error inesperado, sino que podemos decidir si la aplicación puede o no continuar, ya que muchas veces estos errores impiden el flujo normal de la aplicación.

El código completo está aquí:

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  applicationComplete="init()"
                  width="200" height="230">
   
   <fx:Script>
      <![CDATA[
      
         private function init():void{
            loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, captureError );
         }
         
         private function captureError(e:UncaughtErrorEvent):void{
            txtResp.text = "CaptureError";
            if (e.error is Error){
               var error:Error = e.error as Error;
               txtResp.text +=   "nnError ID: " + error.errorID +
                           "nnError Name: " + error.name +
                           "nnError Message:n" + error.message
            }else{
               var errorEvent:ErrorEvent = e.error as ErrorEvent;
               txtResp.text += "n" + errorEvent.errorID
            }
         }
         
         private function viewError(e:Event):void{
            var foo:String = null;
            trace(foo.length);
         }
         
      ]]>
   </fx:Script>
   
   
   <s:Button id="btn" label="Disparar Error"
           click="viewError(event)"
           horizontalCenter="0" top="10"/>
   <s:TextArea  id="txtResp"
           horizontalCenter="0" top="40" width="80%" height="160"
           verticalAlign="top" textAlign="left" color="#FF0000"/>
   
</s:WindowedApplication>

Puedes descargar aquí el ejemplo.

Enviar comentario

Wired crea aplicación para iPads y tablets en Adobe AIR

Jueves, Febrero 18th, 2010

-
Los últimos cinco años, el negocio del contenido impreso se ha ido al mismo lugar donde quedó el telégrafo o Windows Vista. La inversión en publicidad en medios impresos baja constantemente, los periódicos dejan de circular y las revistas mueren o convierten su negocio a una estrategia 100% en linea. Muchos terminan ganando menos, compitiendo con blogs, copypasteadores o innovadores de la industria web. Y hay razones y culpables.

Otros, como Wired, rompen todo esquema y lanzan algo realmente interesante.

¿Recuerdan que Adobe anunció Flash Player 10.1 completo y Adobe AIR para dispositivos móviles? Aprovechando este anuncio, Wired ha creado una nueva experiencia multimedia para leer sus revistas. Con AIR se podrá exportar este producto a Windows, Linux y Mac. En el caso móvil, será posible exportarlo también a tablets basadas en Android. Al final, con el compilador para iPhone de Flash CS5 y el mismo código, lo pondrán en la App Store y podrá ser usado en el iPad.


Una estrategia completa en todas las plataformas usando AIR, InDesign, algo de HTML5 (parece) y Flash.

¿Funcionará? No tengo idea, sigue siendo contenido de pago, pero definitivamente es una experiencia superior y única a lo que ofrece la web. Quizás funcione, quizás no salve a la industria, pero seguro la innovación apoyará a mejorar la industria impresa y empujarla al futuro. ¿Qué opinan ustedes?

Enviar comentario