Compilar en tiempo de ejecución

Hoy hemos decidido salirnos un poco de la programación en Android y marcarnos por la programación básica en java.

Nos surgió poder ejecutar un fichero java sin compilar en tiempo de ejecución y empezamos a investigar. Después de leer la documentación de Oracle vimos como a partir de la java 1.6 existía una herramienta que permitiría compilar un fichero java en cualquier momento y nos pusimos manos a la obra. Esta herramienta es la ToolProvider.

Leer más →

Publicado InfoBolsa CED con licencia LGPL

LGPL

LGPL

Debido a la falta de tiempo para mantener completamente funcional la aplicación InfoBolsa CED, hemos decidido publicarla con licencia LGPL. Puedes ver el repositorio en bitbucket.org. Desde este repositorio podréis descargaros la aplicación completa para modificar los aspectos que deseéis.

Muchas gracias y perdón a todos los usuarios de InfoBolsa CED ya que no hemos podido seguir manteniendo la aplicación.

Cámara, Phonegap y HTML5

Usar la cámara con Phonegap es muy sencillo, pero hoy vamos a explicar como usarla y manejar la información desde HTML5 y javascript. Esto que vamos a explicar es válido para todas las plataformas móviles como IOS, Android y Windows Phone.

Empezamos con la parte sencilla de todos esto, ¿cómo damos permiso para usar la cámara? Esto viene muy bien explicado en la documentación de Phonegap.

Android: Añadimos al fichero config.xml lo siguiente:

<plugin name="Camera"
  value="org.apache.cordova.CameraLauncher" />

En AndroidManifest.xml

<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

IOS: Añadimos al fichero config.xml lo siguiente:

<plugin name="Camera" value="CDVCamera" />

Windows Phone: Añadimos al fichero WPAppManifest.xml lo siguiente:

<Capabilities>
  <Capability Name="ID_CAP_ISV_CAMERA" />
  <Capability Name="ID_HW_FRONTCAMERA" />
</Capabilities>

Leer más →

Controlar el botón volver atrás en Phonegap

En las aplicaciones hechas en HTML5 y Phonegap nos viene la duda si es necesario controlar el uso que el usuario hace del botón volver para no permitir ciertas operaciones.  Controlar dicho botón es muy sencillo, para ello, sólo necesitamos indicarlo en el método “onDeviceReady” de Phonegap.


function onDeviceReady() {
      document.addEventListener("backbutton", handleBackButton, true);
}
function handleBackButton(){

	if($.mobile.activePage.attr('id') == 'home'
              || $.mobile.activePage.attr('id') == 'listaUsuarios'){
		navigator.app.exitApp();
	}else if ($.mobile.activePage.attr('id') == 'cita'){
		$.mobile.changePage('#listaUsuarios');
	}else{
		navigator.app.backHistory();
	}
}

document.addEventListener("deviceready", onDeviceReady, false);

En el ejemplo que se muestra, permitimos que para ciertas páginas, el usuario pueda ir hacia atrás directamente, en otras el usuario irá a una en cuestión, mientras que si se encuentra en las páginas iniciales el usuario se saldrá de la aplicación.

Este método también es válido para Windows Phone 7 y 8.

Esperamos que haya sido útil.

 

Actualización:

Si lo que se quiere es que el botón volver no haga nada, simplemente hay que definir el método y el “listener” dejando el método vacío.

Acción descarada de la administración

Pues aquí estamos, escribiendo otra entrada que no me gustaría nada tener que escribir, apenas 72 horas después de denunciar públicamente los “esfuerzos” por bloquear nuestra aplicación para consultar las bolsas de interinos desde el móvil.

Lamentablemente, nuestra maravillosa administración ha decido poner un captcha al sistema de consulta de bolsas de interinos de la Consejería de Educación de la Junta de Andalucía.

Captcha

Esto, queridos lectores y lectoras, nos aboca, casi inevitablemente, a dejar la aplicación casi inútil, puesto que las ventajas que ofrecíamos de comprobación automática y notificación de variación en bolsa, se antojan casi imposibles teniendo que resolver un captcha.

Seguramente, si se dignan a dar una explicación, sean motivos de rendimiento y/o saturación del servicio. Quien quiera es libre de creérselo… nosotros, personalmente, no lo haremos.

Aún así, no nos daremos por vencidos, y animamos a todo aquel que lea esto a que exija el acceso libre a la información. 

Un saludo y gracias a todos aquellos que, de una forma u otra, habéis contribuido con la aplicación, aunque al final sea para esto…

Software libre, Open Data… y después cerrojazo

En los últimos días estamos sufriendo un auténtico ataque contra nuestra aplicación InfoBolsa CED, tratando de cerrar la puerta a toda petición que venga desde fuera de sus sistemas. En primera instancia pensamos que serían simples actualizaciones de sus sistemas, pero lo último ha sido una redirección a nuestra propia web (esta que leéis), por lo que no queda duda.

No puede ser que un sistema público, pagado con nuestros impuestos, dedique tiempo y esfuerzo a cerrar las puertas a aplicaciones que quieren consumir datos de interés general para los cuales, además, no existe alternativa móvil.

Dicho esto, voy un paso más allá y creo que hasta debería ser obligatorio un API público para consumir dichos datos, y no tener que andar “trampeando” peticiones y demás artimañas… no nos estamos colando en los sistemas del Pentágono, únicamente queremos dar un servicio gratuito al ciudadano que la administración no da.

Esto nos está obligando a actualizar la aplicación con frecuencia, por lo que os rogamos paciencia.

Plugin PhoneGap para Google Analytics

Hace poco tiempo nos enteramos de la nueva Api de Google Analytics para dispositivos móviles. Entonces pensamos en poder comprobar y controlar la cantidad de páginas que visitaban los usuarios cuando navegaban por las aplicaciones de Infobolsa. Para poder llevar a cabo dicha tarea pensamos en desarrollar un Plugin de Phonegap para registrar las páginas que si visitaban. Así que os vamos a enseñar como lo hicimos.

Para empezar incluimos en la carpeta libs las librerías que descargamos desde Google Analytics y ya aprovechamos para actualizar Admob a la nueva versión.

Vamos al grano. Lo primero que necesitamos hacer es incluir un nuevo fichero llamado analytics.xml en la carpeta “res/values/analytics.xml” .

<?xml version="1.0" encoding="utf-8" ?>

<resources>
 <!--Replace placeholder ID with your tracking ID-->
 <string name="ga_trackingId">UA-XXXXXXXXX-1</string>

<!--Enable automatic activity tracking-->
 <bool name="ga_autoActivityTracking">true</bool>

<!--Enable automatic exception tracking-->
 <bool name="ga_reportUncaughtExceptions">true</bool>

 <bool name="ga_debug">false</bool>
</resources>

Donde UA-XXXXXXXX-1 es el código que nos ha dado Google al registrarnos. Podemos activar el modo debug en la clave ga_debug
Para empezar a programar, en el Activity principal sobrescribimos un par de métodos para hacer uso de Google Analytics. Con esto conseguimos que el Tracker arranque y pare junto a nuestra aplicación.

/**
* Arranca Google Analytics
*/
@Override
public void onStart() {
    super.onStart();
    EasyTracker.getInstance().activityStart(this);
}

/**
* Para Google Analytics
*/
@Override
public void onStop(){
    super.onStop();
EasyTracker.getInstance().activityStop(this);
}

Leer más →

Activar Gzip en peticiones Http en Android

Después de llevar mucho tiempo trabajando con las aplicaciones llegué a la conclusión que era necesario reducir la cantidad de datos que se consumía por parte del usuario. Aunque revisando las estadísticas de una persona que hace uso a diario de Infobolsa CED desde el mes de Noviembre no ha llegado a las 400kb es necesario seguir reduciendo esa cantidad de datos.

Para ello, nos pusimos con intentar hacer uso de las cabeceras Gzip en Android. Todo lo necesario es llamar a este método que hemos implementado justo al crear el objeto DefaultHttpClient


private void addGzipInterceptors(DefaultHttpClient httpclient){
	httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

		public void process(
                    final HttpRequest request,
                    final HttpContext context) throws HttpException, IOException {
               if (!request.containsHeader("Accept-Encoding")) {
                   request.addHeader("Accept-Encoding", "gzip");
               }
           }

        });

    httpclient.addResponseInterceptor(new HttpResponseInterceptor() {

         public void process(final HttpResponse response, final HttpContext context) throws HttpException, IOException {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    Header ceheader = entity.getContentEncoding();
                    if (ceheader != null) {
                        HeaderElement[] codecs = ceheader.getElements();
                        for (int i = 0; i < codecs.length; i++) {
                            if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                                response.setEntity(
                                        new CtrlzAppsGzipDescompressingEntity(response.getEntity()));
                                return;
                            }
                        }
                    }
                }
            }
        });
}

Leer más →

Conexiones múltiples con HttpClient en Android

A veces, la configuración del servidor al que vamos a relizar peticiones nos obliga a tener configurado un Pool de conexiones con HttpClient. Esto es necesario cuando debemos simular varios click o una navegación más compleja.
La pregunta es, ¿cuándo es obligatorio realizar esto? Muy sencillo, cuando nos encontramos con la siguiente excepción

Invalid use of BasicClientConnManager: connection still allocated

Leer más →

El teclado en Android hace perder el css media

En algunos dispositivos Android al abrir el teclado sobre nuestra aplicación ocurre que esta desplaza a la aplicación hacia arriba haciendo que esta pierda los estilos si se tiene incluido más de un media por device-width.

Para ello, leyendo por internet he llegado a la conclusión de utilizar dos opciones para evitar este tipo de problemas, especialmente lo he encontrado en algunos dispositivos de la marca SAMSUNG.

Vamos a la solución, en las activities hay que añadir lo siguiente:

android:windowSoftInputMode="adjustPan|adjustResize"

Con esto en algunos dispositivos es suficiente, pero si además añadimos “height=device-height” en el “viewport” de nuestro HTML queda solventado para todos los dispositivos y versiones actuales.

 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0" />

Nota final, si estáis además desarrollando para IOS, no es recomendable usar “height=device-height” ya que esto hace que los dispositivos de la manzana no tengan en cuenta la barra de estado produciendo un pequeño scroll.

A %d blogueros les gusta esto: