Archivo del autor: ctrlzapps

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 →

Hacer peticiones HTTPS desde Android

Hace unas semanas empezamos con el desarrollo de nuestra nueva aplicación. Al igual que InfoBolsa CED era necesario implementarla haciendo llamadas mediante la libreria de Apache HttpClient a un servidor externo. Esta nueva aplicación hace uso del núcleo principal de InfoBolsa CED ya que estará orientada a la misma funcionalidad pero para otra comunidad autónoma.

La diferencia principal con InfoBolsa CED es que esta vez era necesario llamar al servidor externo haciendo uso de HTTPS. Así que nos pusimos manos a la obra y empezamos a investigar por internet para llegar a tener dicha funcionalidad.

Lo primero es levantar el KeyStore de Java y cargarlo en una clase que extiende de SSLSocketFactory implementada para el caso. Una vez intanciado el Socket para la llamada se le indica que esquema y puerto va a usar para luego registrarlo en nuestro HttpClient.

DefaultHttpClient localDefaultHttpClient = new DefaultHttpClient();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);

SSLSocketFactory sf = new CtrlzAppsSSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Scheme sch = new Scheme("https", sf, 443);
localDefaultHttpClient.getConnectionManager().getSchemeRegistry().register(sch);

Y eso es todo, nuestra aplicación Android ya puede llamar a servidores externos usando HTTPS
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 →

Localstorage en Android y cualquier otro sistema

Con la llegada de HTML5 llegó el uso de localstorage para poder almacenar datos en cliente. En los navegadores de escritorio es necesario pedir permiso al usuario para permitir este alojamiento, pero en los dispositivos móviles no es necesario realizarlo.

Vamos a explicar un poco como se usa este localstorage con Javascritp. Para empezar, es necesario para versiones de Android superiores a la 4.0  informarlo en el Activity por defecto.

@Override public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     super.init();

     super.appView.getSettings().setDomStorageEnabled(true);
     ......
     ......
}

Leer más →