Archivos de etiquetas: android

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 →

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 →

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ñadir un evento en el calendario de Android con PhoneGap

Esta vez en un proyecto en la empresa surgió la necesidad de dar la posibilidad al usuario de añadir un evento al calendario de su dispositivo. En todo esto hay un pero, hasta Android 4.0 o superior el calendario no era aplicación nativa por lo cual era casi imposible poder interactuar correctamente con el mismo. Bueno, me dejo de rollo y empezamos manos a la obra.

Lo vamos a realizar haciendo uso de los plugins de Phonegap. Para ello, lo primero será crear nuestra clase CordovaPlugin.

public class CalendarPlugin extends CordovaPlugin {
     @Override
     public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {

          if (action.equals("saveEvent")) {

               String message = "Cita para "+args.getString(0);
               Intent intent = new Intent(Intent.ACTION_EDIT);
               intent.setType("vnd.android.cursor.item/event");
               intent.putExtra("title", message);
               intent.putExtra("eventLocation", args.getString(1));
               intent.putExtra("description", args.getString(5)+ ", "+args.getString(4));
               Calendar cal = Calendar.getInstance();
			   intent.putExtra("beginTime", cal.getTimeInMillis());
			   intent.putExtra("endTime", cal.getTimeInMillis()+10*60*1000);
               cordova.getActivity().startActivity(intent);
               return true;
		   }
		   return false;
     }
}

En el método execute por defecto de CordovaPlugin hacemos uso de un Intent propio de Android “Intent.ACTION_EDIT” que nos permitirá lanzar la edición del calendario. A dicho Intent se le puede añadir más extras para así incluso configurar alarmas, repeticiones e invitados al evento.

Leer más →

Estado de la conexión en Phonegap y Android

Es muy importante tener controlado en todo momento si nuestro dispositivo Android está conectado a internet o no lo está. De esta forma se mantiene informado al usuario que si intenta realizar cualquier operación que necesite acceso a Internet no se va a llevar a cabo correctamente.

Es necesario configurar varios ficheros para poder hacer uso del acceso al estado de la red, Para PhoneGap hay que añadir al fichero “res/config.xml” el plugin de phonegap para el uso del servicio.


     <cordova>
         <access origin="http://127.0.0.1*"/>
         <access origin=".*"/>
         <log level="INFO"/>
         <preference name="useBrowserHistory" value="true" />
         <preference name="exit-on-suspend" value="false" />
         <plugins>
              <plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager"/>
                   .....
                   .....
                   .....
              </plugins>
      </cordova>

A nivel de permisos de Android, hay que activar el siguiente para que tengamos permiso a acceder a ellos.

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

Leer más →

Como solucionar que el select nativo no se abra en algunas versiones de Android

select oen

Estilo del select con JqueryMobile

Una vez teníamos la aplicación en funcionamiento y en producción vimos que al convertir la página de Nuevo Usuario en un PopUp el combo o select nativo de HTML dejaba de abrirse en algunas versiones de Android con jQuery Mobile. La versiones afectadas eran las 2.3.X es decir, Android Gingerbread.

Leer más →

CrossDomain en Phonegap

Si su aplicación PhoneGap necesita realizar llamadas a un servidor externo a su dispositivo es necesario añadir el crossdomain en PhoneGap. Todo es tan rápido y sencillo como añadir al fichero config.xml que se encuentra en xml/config.xml la siguiente linea.

<cordova>
         .....
         <access origin="http://127.0.0.1*"/> <!-- paginas locales -->
	     <access origin="http://www.servidorexterno.com/" subdomains="true"/>
         .....
         <plugins>
            .....
            .....
            .....
         </plugins>
</cordova>

Leer más →

SQLite, Android y Phonegap, adios Localstorage

Conforme la aplicación fue avanzando nos vimos obligados a cambiar el sistema de almacenamiento de datos para hacerlo un poco más robusto. Para ello optamos por implementar SQLite en la aplicación.

SQLite viene por defecto en la API de Android y no es necesario incluir ninguna librería extra. Como introducción está bien, pero vamos a pasar a lo interesante.

Para crear la Base de Datos que va a usar la aplicación solo necesitamos instanciar una clase que extienda de SQLiteOpenHelper. Cuando se haga esa llamada al constructor de la clase, el método super, comprobará internamente si existe la base de datos, en caso contrario la creará inmediatamente y ejecutará el método onCreate donde tendremos las queries que queremos ejecutar al iniciar. Este método sólo se ejecutará si la base de datos no existía. En cualquier otra instanciación de la clase DataBase no se ejecutará.

private String CREATE_USER_SQL = "CREATE TABLE accounts (_id INTEGER PRIMARY KEY AUTOINCREMENT, nif VARCHAR(10), name TEXT, bolsa TEXT)";

private String CREATE_POSITIONS_SQL = "CREATE TABLE positions (_id INTEGER PRIMARY KEY AUTOINCREMENT, general INTEGER, sevilla INTEGER, nif VARCHAR(10), fecha DATETIME DEFAULT CURRENT_TIMESTAMP)";

public class DataBase extends SQLiteOpenHelper{

     public DataBase(Context context) {
         super(context,InfobolsaConstants.DATABASE_NAME, null, InfobolsaConstants.DATABASE_VERSION);
     }

     @Override
     public void onCreate(SQLiteDatabase db) {
         db.execSQL(CREATE_USER_SQL);
         db.execSQL(CREATE_POSITIONS_SQL);
     }

     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         if(oldVersion == 1){
	     db.execSQL(InfobolsaConstants.ALTERTABLE_POSITIONS_SQL);
	     db.execSQL(InfobolsaConstants.CREATE_POSITIONS_SQL)
        }
        if(newVersion == InfobolsaConstants.DATABASE_VERSION){
             db.execSQL(InfobolsaConstants.ALTERTABLE_BOLSAS_SQL);
             db.execSQL(InfobolsaConstants.CREATE_BOLSAS_SQL);
             db.execSQL(InfobolsaConstants.ALTERTABLE_BOLSAS_DATA_SQL);
        }
     }
}

Posteriormente, si la versión de la base datos es superior a la que había antes, se ejecutará el método onUpgrade que o bien podemos dejar vacío o bien podemos ejecutar una SQL que nos permita hacer una migración o actualización de datos. Para ello, podemos usar los parámetros oldVersion y newVersion para saber con cual versión queremos que se ejecute dicha actualización.

Leer más →

Usar ADMOB en Android

Admob

Sistema de publicidad de Google

Los creadores de aplicaciones para Android pensamos en crear bien la aplicación de pago, algo muy complicado en esta plataforma tan fácilmente pirateable o bien poner en la aplicación publicidad. Pues bien, nosotros optamos por ADMOB que es la más sencilla y más fácil de configurar, pero eso sí, es muy difícil conseguir dinero con ello.

Antes de nada, es necesario registrarse en la plataforma de ADMOB para obtener un identificador de la aplicación. Una vez obtenido el código único para nuestra aplicación, pasamos al desarrollo.

Para empezar con el desarrollo, lo primero es descargarse la SDK de ADMOB para dispositivos móviles de esta página. Una vez descargado el paquete, es se añade el lib de Android dentro de la carpeta libs de nuestra aplicación. Es un JAR muy ligero y no hará que la aplicación pese mucho.

Leer más →

A %d blogueros les gusta esto: