martes, 5 de abril de 2011

Cómo crear un programa en Java para móviles descargable de Internet usando el teléfono.

Objetivo:
  Hacer un programa en Java que se pueda descargar de internet desde el mismo teléfono, que se instale en el teléfono automáticamente y que se pueda acceder a el con un ícono. (Al estilo de los juegos para teléfono descargables de la web)


No todos los teléfonos tienen acceso a una memoria externa (memoria flash como la de una cámara digital), el lector puede pensar que basta con copiar los archivos java del programa existente al teléfono, pero no es así, no todos los teléfonos lo permiten.


Complementos de Lectura y Descargas Altamente Recomendados


Midlets y Blackberries (PDF)



Alternativas: Html para Móviles, jQuery Mobile

Aunque este texto que aqui pongo es para crear una aplicación java para un móvil, existen otras alternativas también válidas como:

http://jquerymobile.com/ , aquí puedes crear una página optimizada para un móvil de forma muy sencilla y visual. No es lo mismo a lo que aqui describo mas abajo, la diferencia es que en este blog describo los pasos para hacer una "aplicación en java" que podrá ser instalada y ejecutada en telefonos con soporte java, mientras que la opción de jquery mobile te permite hacer una "página web mobile", lo cual no es java sino html con formato para moviles. Es distinto..

¿ Cómo se hace una aplicación Java para un móvil ?

  Se creará una aplicación en lenguaje Java con configuración CLDC (para móviles con baja capacidad) que se pueda instalar en modo OTA (Over The Air), es decir con una descarga de internet  directa desde el teléfono y con su consecuente instalación automática, tanto en un teléfono BlackBerry como en otro diferente.

 El procedimiento básico es crear una aplicación con la tecnología J2ME CLDC, la cual generará dos archivos: un JAR (la aplicación como tal en java) y un JAD (es un archivo de configuración).  En algunos teléfonos basta con copiar estos dos archivos en una memoria para luego instalarlos haciendo click en ellos. Pero no todo es tan fácil..en un BlackBerry no se puede, al menos no en todos los modelos. La solución propuesta aquí es subir los archivos JAD y JAR a un hosting con PHP para crear luego un script PHP que permita descargar estos archivos con su tipo MIME correcto.  Por defecto en algunos Blackberries, el tipo mime que este asume no es el correcto, por tanto el script PHP se encargará de decirle a la BlackBerry que use el tipo Mime correcto.

En el telefono primero se descarga el archivo JAD, quien contiene toda la información, el icono y la clase Java a usar, y muy importante: el archivo jar (uno o varios) a descargar.  El telefono usa la informacion del JAD para descargar el archivo JAR, y procede luego a instalarlo. Por tanto en este documento veremos todas las etapas de esta configuración.



Este ejemplo se probó en dos teléfonos y funciona:  
  • Blackberry 7130e con OS: 4.2.1
  • Un Huawei cualquiera (modelo Qwerty)
Captura de pantalla en el Blackberry 7130e:

Imagen de cómo se verá el icono
Pantalla que aparecerá
Primero que todo se necesita programar en Java, usando J2ME, para que la aplicación se vea en todos los telefonos que soporten Java, al principio quise programar con el Api de Blackberry, pero despues pense que era mejor trabajar en Java para no depender de la plataforma de Blackberry, además de que para usar el Api de Blackberry se debe pagar por el derecho de uso del API, alrededor de 20 dolares, sino se generarán errores de acceso denegado al correr la aplicación en un dispositivo físico (en el emulador de blackberry no falla, pero en el físico si).

Descarga de Java Me

El sitio oficial de JavaMe es: http://www.oracle.com/technetwork/java/javame/overview/index.html  , allí encontrará enlaces y herramientas útiles, por ahora me enfocaré en descargar la herramienta principal de desarrollo en Java para Moviles:  Descargar Java ME SDK 3.0,  descarge este componente a su equipo y luego instalelo.  Se le pedirá un usuario y una clave, pero puede obviarlo dejando en blanco los campos. Es opcional.  También puede probar este enlace directo: Descargar

Una vez instalado el componente de Java Me SDK, se ejecuta y debe aparecer este IDE (Integrated Development Environment)









Este IDE es una plataforma de desarrollo, aqui se compila el código a crear, como resultado generará dos archivos:  un JAD y un JAR, que serán los archivos finales de este tutorial, se deberán subir a un sitio web de nuestra propiedad  (o un hosting que soporte PHP) para publicarlos.

Truco:  cuando los archivos JAD y JAR esten listos no basta con subirlos a cualquier hosting, debe crearse un programa PHP para que descargue contenido MIME:  "text/vnd.sun.j2me.app-descriptor" con el objeto de que el teléfono o dispositivo pueda hacer su trabajo de instalación, de lo contrario el teléfono no instalará la aplicación.

Sigamos, hacer click en New Project, aparecerá el asistente, seleccionar MIDP Application, en la siguiente pantalla dejar las opciones por defecto (para demostración nada mas),  el asistente trae una opción que dice: "Create Hello Midlet", es para crear una aplicación muy básica para efectos de pruebas, la usaré en este tutorial.

La siguiente pantalla del asistente pide el tipo de aplicación, seleccionar:
  • Emulator Platform: CLDC - "Java(tm) Platform Micro Edition SDK 3.0" (es el tipo de aplicación, debemos seleccionar siempre CLDC, lo cual significa que es la configuración de Java para teléfonos de baja capacidad, incluyendo Blackberries) 
  • Device: ClamshellCldcPhone1  (es el tipo de emulador para las pruebas, mostrará un telefono virtual en pantalla para pruebas)
  • Device Configuration:  marcar: CLDC-1.1
  • Device Profile: marcar: MIDP-2.0
click en botón finish y se creará una aplicación básica, se debe ver así:

En la pantalla que se muestra aquí seleccionar el proyecto y hace click en el ícono Run, para ejecutar la aplicación (la fecha verde).


Aparecerá el emulador del teléfono virtual seleccionado anteriormente, asi:


Listo, con estos pasos se ha creado una aplicación muy básica que muestra el mensaje "Hello World" y que además corre bien en el emulador.

El archivo JAR y JAD.

Estos archivos se encuentran en la carpeta /dist del proyecto creado, son generados cuando se hace el Build del proyecto, pero hay que corregir algo:  si los nombres de archivo estan en la forma "Camel" (con mayusculas y minúsculas) entonces será problemático al momento de descargalos de internet, sobre todo con servidores basados en Linux.

Por tanto, se debe configurar el proyecto (click derecho en proyecto y luego ir a propiedades) para que los nombres de los archivos JAR y JAD sean en minúsculas solamente al momento de ser generados tras aplicar el comando "Build".

ir a propiedades del proyecto: "Creating Jar". Poner en minúsculas los nombres de archivo jar y jad


Datos de Configuración del JAD.

El archivo JAD generado es un archivo de texto, con parametros que usará el teléfono al momento de descargar la aplicación de internet.  Aquí se deben cuidar tres parámetros: el icono, el nombre del midlet a usar y la ruta de descarga del JAR.

La ruta de descarga del JAR se requiere cuando uno accede al website de descarga de la aplicación java desde internet. Se descarga primero el archivo JAD (el que tiene la información), luego el teléfono usa la información del JAD para descargar de nuevo la aplicación JAR, luego ejecuta del JAR el midlet indicado. Tenga esto en cuenta a futuro.

Pasos:
  1. generar un icono.  Seleccione un pequeño icono de 20x20 pixels al menos, en formato PNG o JPG, y subalo al proyecto:

    Click derecho en "Resources" (en el panel a la izquierda) y seleccionar del menu flotante: "add folder", para luego explorar la ubicación de -la carpeta que contiene al icono-, no el icono como tal.

    debe quedar algo como esto:

  2. Configurar el JAD:
    Desde el IDE, hacer click derecho sobre el proyecto y seleccionar Propiedades, aparecerá esta ventana, aquí seleccionar a la izquierda "Application Descriptor", debe verse así:
    pantalla de propiedades del proyecto, pestaña Midlets
    luego ir a la pestaña "Midlets", seleccionar el midlet (o hacer click en add) y luego en el botón "Edit".

    note que /icon.png es el icono que se subio antes, si el icono se puso en otra parte debe indicarse aqui, de todos modos es bueno verificar la ubicacion del icono usando winRar para ver el contenido del JAR generado.
    cuidado con las mayusculas y las minúscula

    finalmente editar los atributos del midlet en la pestaña "Attributes", allí se indicará la ruta de descarga del JAR.  Suponga que el sitio web donde se alojará el JAR y el JAD será: http://test.ascinformatix.com.  Se supone en este ejemplo que el JAR y el JAD se subirán a este servidor para luego ser bajados de ahí desde un teléfono, por tanto la URL de descarga del archivo JAR será:

    http://test.ascinformatix.com/mobileapplication1.jar
    (al pie del dialogo se debe marcar el check de Override y luego poner esta ruta )

    Todos estos parametros se le indican al archivo JAD usando el IDE, para que cada vez que genere el archivo JAD lo haga con estos atributos, tanto el icono, como la ruta de descarga del JAR como el nombre del Midlet que ejecutará.

  3. finalmente el archivo JAD siempre debe lucir así luego de hacer "Build"


    MIDlet-1: HelloMIDlet,/icon.png,hello.HelloMIDlet
    MIDlet-Jar-Size: 1767
    MIDlet-Jar-URL: http://test.ascinformatix.com/mobileapplication1.jar
    MIDlet-Name: MobileApplication1
    MIDlet-Vendor: Vendor
    MIDlet-Version: 1.0
    MicroEdition-Configuration: CLDC-1.1
    MicroEdition-Profile: MIDP-2.0

    Cuando desde un teléfono se quiera instalar la aplicación, uno primero descarga el JAD, luego el telefono lee el JAD y descargará el JAr desde: "MIDlet-Jar-URL",  instalará un ícono, indicado en: "MIDlet-1: HelloMIDlet,/icon.png,hello.HelloMIDlet", ejecutará la clase: hello.HelloMIDlet, y le dará como titulo e Id del midlet a: "HelloMIDlet"

Instalar la Aplicación Java a usando Descarga de Internet

No se pueden subir archivos JAR directamente a un Blackberry, puedes causar que este entre en un grave deadLock (nota #1), en cambio deben ser primero convertidos:  del Jar se crea un archivo COD, y luego se crea manualmente un archivo ALX el cual ahora si puede ser subido al Blackberry usando el Desktop Manager. (el programa que trae Blackberry para subir aplicaciones al telefono).

  (notas:  #1) deadLock es una falla que hace que el blackberry se reinicie solo sin permitir usarlo)


La mejor solución que encontré luego de varias vueltas fue la de hacer que la aplicación se instale en el teléfono a modo de descarga, es decir, uno abre el explorador de internet en el teléfono y descarga la aplicación Java directamente sobre el teléfono, quien a su vez hará la instalación.

Que cosas no se deben hacer:

    Al menos en el Blackberry, no se puede copiar la aplicación Java en una memoria externa o a través de USB y luego abrirla desde el Blackberry, en otros teléfonos si se puede, pero estamos tratando de hacer que el procedimiento sea igual para todos los teléfonos, Blackberries o no.

  Tampoco se puede simplemente descargar el JAR desde un website sin una configuración previa, es decir, subimos los JAR a un website asi ligeramente y luego desde el teléfono los descargamos: no funciona.  La razón es que al hacer eso el Blackberry no conocerá el MIME TYPE del archivo a descargar y tratará al archivo JAR como un archivo de texto o html y lo presentará como tal, mostrando en la pantalla un conjunto de caracteres.

entonces ?, siga leyendo:

Cómo Preparar el WebSite de Descarga de la Aplicación

  Hay que configurar el website para que un Blackberry u otro dispositivo pueda saber que es una aplicación Java y actúe como tal. Esto se hace configurando un script PHP que indique que el tipo MIME a descargar sea uno del tipo: "text/vnd.sun.j2me.app-descriptor". Por defecto, cuando un Blackberry quiere descargar un JAR desde internet asume erroneamente que es un tipo MIME: "html/text" y por consiguiente no ejecutará la aplicación, mostrando en cambio un conjunto de caracteres.
  1. Se suben los archivos JAR y JAD generados por la aplicación a un sitio web al que tengamos acceso y poder de usar el PHP, en este caso los archivos a subir son mobileapplication1.jad y .jar, cuidado con las mayusculas y minusculas.
    para ver la lista de archivos hacer click en "Files" en la barra de la izquierda, (o puede explorar el proyecto con Windows..)
  2. En mi caso, yo subiré los archivos vía FTP a un servidor de mi propiedad, ubicado en la dirección: test.ascinformatix.com. Suba usted los archivos a su hosting, donde tenga un servicio PHP disponible o su equivalente en Java o ASP.NET.
  3. Una vez los archivos existente en su hosting, compruebe que puedan ser descargados manualmente, probando estas url:  (yo usaré como hostname a test.ascinformatix.com)

    http://test.ascinformatix.com/mobileapplication1.jad y http://test.ascinformatix.com/mobileapplication1.jar

    puede crear un script html como este para probar:

    --- inicio archivo test.html, subalo a su hosting y pruebelo ---
    <body>
      <a href="/mobileapplication1.jad">descarga JAD</a>
      <a href="/mobileapplication1.jar">descarga JAR</a>
    </body>

    --- fin archivo test.html ---

  4. Una vez comprobado que los archivos son accesibles desde internet manualmente, entonces proceda a crear un script PHP que fuerze la descarga pero con mimeType:  "text/vnd.sun.j2me.app-descriptor"

    ---inicio archivo down.php---
    <?php 
      $localfile="D:/SERVIDOR/htmlRoot/mobileapplication1.jad";
      header('Content-disposition: attachment;
      filename='.$localfile);
      header('Content-type: text/vnd.sun.j2me.app-descriptor');
      readfile($localfile);
    ?>

    ---fin archivo down.php---

    note que uso la ruta física:  
    "D:/SERVIDOR/htmlRoot/mobileapplication1.jad"
    esta es la ubicación del archivo JAD -ya subido al servidor-, es para que el script php sepa donde ubicar al archivo JAD dentro del servidor. Este script entregará el archivo JAD indicado aqui directamente a quien lo solicite (el telefono) pero en el tipo MIME correcto, y por tanto el telefono podrá instalar la aplicación Java, si no hace esto el teléfono Blackberry no instalará la aplicación.

    para saber la ruta fisica de un archivo alojado en el servidor use las variables de PHP, por ejemplo este script ayuda a saber cual seria la ruta fisica, la cual en este ejemplo es: "D:/SERVIDOR/htmlRoot/"

    Para saber la ruta física de su servidor, use la variable de php: _SERVER["DOCUMENT_ROOT"], en un script como este:
    <?php
       echo $_SERVER["DOCUMENT_ROOT"];
    ?>

    el script anterior podría quedar así:

    ---inicio archivo down.php---
    <?php $localfile=
       $_SERVER["DOCUMENT_ROOT"]."/mobileapplication1.jad";

      header('Content-disposition: attachment;
      filename='.$localfile);
      header('Content-type: text/vnd.sun.j2me.app-descriptor');
      readfile($localfile);
    ?>
    ---fin archivo down.php---
  5. Solo queda crear una pequeña página HTML para poder navegarla desde los teléfonos móviles y así poder finalmente descargar la aplicación en el teléfono, quien la instalará automáticamente:

    (asumo que ha llamado "down.php" al script php que menciono mas arriba, y que ya existe en el servidor de su preferencia)




  6. pruebe primero que funcione desde el PC, navegando en:
    http://test.ascinformatix.com/index.html

    al hacer click en "descargar" el sistema debe abrir un dialogo "Guardar Como" para que guarde el JAD descargado en su PC, no debe mostrar el contenido del JAD en el navegador
    .

  7. ahora, finalmente pruebe desde el teléfono:
    navegue a: http://test.ascinformatix.com/index.html

    así debería verse la página http://test.ascinformatix.com/index.html  en el móvil.




    Suerte !

2 comentarios:

  1. excelente gracias, pero tengo tiempo que no programo me podrias dar tu correo para intentar hacerlo por favor y para comentarte algo que quiero hacer necesito ayuda de gente que ya halla trabajado esto antes de nuevo gracias cualquier cosa si me quieres dar algunas ideas o coneversar aqui dejo mi correo para pedir ayuda al que me quiera ayudar jrg_300i@hotmail.com y jobran.rodriguez@gmail.com

    ResponderEliminar