sábado, 30 de marzo de 2013

Práctica de SEMPRECELTA publicada en Google Play Store

Hola,
ya he publicado mi práctica en Google Play Store (la de SEMPRECELTA), le voy haciendo cambios (voy por la 3ª versión) ya que en cada móvil se ven algunos layouts de manera diferente; pero mejorandola cada día
Iré añadiendo nuevas funcionalidades semana a semana. A los celtistas espero que os guste.

Saludos,

Laura.

viernes, 22 de marzo de 2013

Método para comprobar si nuestro dispositivo tiene conexión de datos activa

Un método sencillo para comprobar si nuestro dispositivo móvil tiene conexión de datos activa, es el siguiente:




 Devuelve true en caso afirmativo, y false en caso contrario.

Inicialización de CameraUpdateFactory

Al subir una aplicación al Play Store nos encontrabamos con el error:
* java.lang.NullPointerException: CameraUpdateFactory is not initialized

Buscando por internet se dice que es necesario inicializarla aunque el eclipse no lo pida, para solventarlo añadiremos el siguiente codigo:

try {
MapsInitializer.initialize(this);
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}

jueves, 21 de marzo de 2013

Error en el comando MSDOS para obtener SHA1

En windows Xp a veces el comando

keytool -list -alias androiddebugkey -keystore C:\Lugar\donde.Esté.la carpeta de tu keystore\debug.keystore -storepass android -keypass android -v

no funciona, dando un error como este:

Opci¾n no permitida:  and
keytool -list [OPTION]...

Cuando pase esto, es porque DOCUMENTS AND SETTINGS no es un nombre de carpeta válido, por lo que hay que reducirlo a :
Docume~1

Espero que os sirva! :D

Error al abrir google-play-services_lib

Qué hacer cuando sale esto al intentar abrir la librería google-play-services_lib

The project description file (.project) for 'google-play-services_lib' is missing. This file contains important information about the project. The project will not function properly until this file is restored.

Esto ocurre cuando por algún motivo la librería ha perdido el archivo .proyect.

Primero seguimos estos pasos:

1.- Asegúrate de que tienes descargados los últimos plugins con el SDK manager (en mi caso fue este error, desinstalé el ADT y no instalé los plugins de nuevo). En caso de verlo instalado, desinstálalo y vuelve a instalarlo.


2.- Click File -> Import...,
select Android -> Existing Android Code into WorkspaceBrowse to and 
select <android-sdk-folder>/extras/google/google_play_services/libproject/google-play-services_lib
Project -> Properties -> Android -> Library, Add -> google-play-services_lib. 

Tras eso debiera funcionar, si sigue fallando... reinstalad el sdk y si sigue fallando, el ADT completo... si tras eso falla de nuevo... quemad el pc :D (o buscad en google)

(fuente de ciertos pasos: http://stackoverflow.com/questions/15270586/google-play-services-in-eclipse-has-stopped-working)

miércoles, 20 de marzo de 2013

miércoles, 13 de marzo de 2013

Copiar base de datos desde la carpeta assets

Para copiar una base de datos desde assets, debemos introducir el siguiente código dentro de la clase BaseDatosHelper :


Una vez echo esto, dentro de la clase CapaAccesoDatos debemos introducir el siguiente código


Donde debemos modificar com.paquete.ejemplo por el nombre de nuestro paquete. Con esto ya tenemos la base de datos guardada dentro de la variable database y podemos manipularla como queramos

martes, 12 de marzo de 2013

Como usar php para conectar android a MySQL

Leed y "disfrutad":

http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/

http://www.coderzheaven.com/2011/04/08/android-phpmysql-connection/

http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/

Los tres links lo explican, yo voy a usarel primero, que lo explica TODO, paso a paso.

Inicialmente explica qué es un WAMP (windows, apache, mysql, phpmyadmin) y nos enseña a usar uno en nuestro pc para ser nosotros nuestro propio host. Nosotros usaremos un host externo: http://www.000webhost.com

Tras enseñarnos a montar nuestro propio server y montar nuestra aplicación web en php (un vídeo y unos links que no son necesarios si creamos nuestra BBDD en 000webhost), nos explica como crear una base de datos. Los pasos son parecidos, salvo que lo hacemos en 000webhost (el phpmyadmin de 000webhost no es muy diferente del que instalas con el WAMP).

Tras crear la base de datos, le ponemos datos y pasamos a crear archivos PHP para el manejo externo de la base de datos (php permite controlar una base de datos haciendo uso de un método POST para introducir consultas). Nosotros vamos a crear esas consultas predefinidas.


************************************************************************************************************
Yo las he creado y he puesto un par en mi servidor, pero no devuelven lo que yo quiero. Y eso ocurre porque en el primer link para los archivos php usan una variable llamada __DIR__ que solo existe en versiones de php 5.3 o mayores. Hay que usar dirname(__FILE__). (explicado aquí: http://stackoverflow.com/questions/2749416/is-there-any-difference-between-dir-and-dirname-file-in-php)(otro truco para saber si vuestra versión de php soporta esa variable, es ponerle esto en cualquier parte del código php).
var_dump(dirname(__FILE__));
var_dump(__DIR__);

Si salen 2 direcciones por pantalla, todo ok, si solo sale 1, usad dirname :D
************************************************************************************************************

Al usar esta variable más vieja, más rápida y más versatil, los archivos devuelven esto: 

http://herbinhas.comyr.com/herbalife_app/get_todos_productos.php

Es el resultado de una consulta SELECT * from productos.

Una vez creados todos los archivos .php con nuestras consultas (recordad que hay que modificar los archivos que aparecen en la página, para que coincidan con los campos de las tablas de nuestra base de datos), creamos los archivos .java necesarios y los layout necesarios. Recordad cambiar las URL del ejemplo para vuestros servidores.

Recordad buscar en la página la clase JSONParser.java... está hacia el final, y no dice nada sobre que hay que crearla, porque por defecto, este parser no existe en el SDK.(hay cosas parecidas). Aquí ya depende mucho de vuestro proyecto. En el ejemplo se usan botones e intents. Podéis modificar los archivos .java para que usen menús, fragments... o lo que se os ocurra.

lunes, 11 de marzo de 2013

Como crear desplazamiento horizontal (android 5 views desktop)


No sólo de intents vive Android.

Hay maneras igual de efectivas para cambiar el contenido de un layout, con efectos... más llamativos. Pero lo llamativo tiene un precio en complicación.

Se pueden usar fragments para otra cosa distinta que un mapa. Como por ejemplo, crear un fragment personalizado, donde aparezca lo que te dé la real gana. Como por ejemplo, un escritorio de 5 vistas de Android.

Si queréis ese efecto de "5escritorios" o "5layouts" en los que desplazaros lateralmente, os leéis esto, lo entendéis, lo implementáis y me lo explicáis :D

http://wptrafficanalyzer.in/blog/implementing-horizontal-view-swiping-using-viewpager-and-fragmentpageradapter-in-android/

En esta página se explica como usar un viewpager(elemento de un layout, en XML), una clase fragment(será nuestro contenedor para las referencias y lógicas de negociación del contenido del fragment) y una clase fragmentPageAdapter (por decirlo de alguna manera, el oncreate del fragment como elemento). A parte, se crea un layout nuevo para el contenido del fragment. (No sé si lo he explicado bien, o si se entiende, si es confuso, bienvenidos a mi mundo, os lo explico con detalle si me preguntáis).


La otra manera de entender esto (la mía) es copiar y pegar, y luego ejecutar con un montón de LOGS.D(), ver como funciona y modificarlo según tus necesidades. Un consejo, si vais a usar esto, os recomiendo que tengáis claro qué queréis conseguir, porque es complicado. Cuando logre entender exactamente como funcionan las clases que usan, lo explico más detalladamente, con imágenes de mis resultados.

Obtener nombre de la localización a través de google places

Usando los datos de longitud y latitud se puede obtener el nombre de las ubicaciones a través de google places, necesitamos tener el proyecto configurado para google maps como hemos visto antes, esto hace necesario tener la API_KEY, importada la google_play_services_lib y añadida al proyecto.

El código usado sería algo parecido a esto:


// Elemento geocoder en el contexto
Geocoder geocoder = new Geocoder(mContext);
// Elemento list que contendra la direccion
List<Address> direcciones = null;

// Funcion para obtener coger el nombre desde el geocoder
try {
direcciones = geocoder.getFromLocation(latitud, longitud,1);
} catch (Exception e) {
Log.d("Error", "Error en geocoder:"+e.toString());
}

// Funcion que determina si se obtuvo resultado o no
if(direcciones != null && direcciones.size() > 0 ){

// Creamos el objeto address
Address direccion = direcciones.get(0);

// Creamos el string a partir del elemento direccion
direccionText = String.format("%s, %s, %s",
                    direccion.getMaxAddressLineIndex() > 0 ? direccion.getAddressLine(0) : "",
                    direccion.getLocality(),                  
                    direccion.getCountryName());
}

El elemento geocoder es el encargado de obtener los datos a partir de la latitud y la longitud.
Esta información la almacenamos en un objeto List y el tipo de datos será Address. El objeto List es un grupo de objetos tipados, similar a un array. Los datos Address son Strings de datos que contienen direcciones.
Por último creamos otro objeto Address para obtener los campos de la dirección que deseamos y lo ponemos en un String.
Con String.format indicaremos el formato del texto a introducir, la primera parte indica el formato donde %s son variables de tipo string y lo obtenemos de de las lineas siguientes con los get.

Por último ya podemos mostrar la dirección almacenada en direccionText. Se recomienda usar un proceso runnable e hilos o una asynctask.



Facilito los códigos de una clase creada para obtener la localización, hay que introducir la API_KEY en el manifest:

https://www.dropbox.com/s/66l4gyefp7gms81/geolocejemplo.rar

Documentación:
Objeto Address
Objeto List
Objeto Geocoder




Página para buscar iconos

http://www.iconfinder.com

Tiene miles de imágenes (libres), puedes elegir el tamaño de las mismas, y el fondo: blanco, negro o transparente. Disfrutadlo.

viernes, 8 de marzo de 2013

Crear un nuevo fichero de claves (debug.keystore)

En ocasiones, el SHA1 que nos da el debug.keystore no lo acepta Google. Es decir, creas un API KEY en Google con la SHA1 que te da .android/debug.keystore, y cuando intentas abrir un mapa en tu aplicación te da problemas, es decir, Google no te acepta la clave.

La solución sería crear un nuevo fichero de claves, que te dará un nuevo SHA1.

Para realizar esto, abrimos el fichero de AndroidManifest.xml en Eclipse, y pulsamos sobre la pestaña Manifest, y una vez ahí elegimos "Use the export Wizard".


La primera ventana la dejamos igual, ya que es el nombre del proyecto.
Pulsamos siguiente y nos muestra un formulario para crear una nueva clave:

Una vez pulsamos tenemos que configurar la nueva clave, a la cual debemos darle la misma información es decir como alias pondremos androiddebugkey y como clave android.

Añadimos la información de la key, alias->androiddebugkey y password->android
Tal y como se muestra a continuación:


Elegimos la ruta del archivo apk, este fichero aquí no nos hará falta,es el archivo de instalación de nuestra aplicación. Le podéis dar cualquier ruta.


Ya tenemos creada el nuevo fichero de configuración, ahora tenemos que asignárselo a Eclipse, para que sepa que nuestras aplicaciones estarán vinculadas a él.
Window->Preferences
En Custom debug store elegimos nuestro fichero de clave, recién creado.




Ahora abrimos el cmd, y obtenemos nuestro SHA1, para decirle a Google que esa es nuestra clave, en nuestro ordenador asignado al debug.keystore creado (si utilizásemos otro ordenador, habría que crear otra)
Escribimos en la línea de comandos:
keytool -list -alias androiddebugkey -keystore c:/Users/tuusuario/debug.keystore -storepass android -keypass android -v

c:/Users/tuusario->es donde guardasteis la clave creada en Eclipse.


Y se obtendría SHA1


El SHA1 junto con el paquete de vuestro proyecto sería lo que tendríais que utilizar para crear una nueva API KEY en Google, y después asignársela a vuestro proyecto en el AndroidManifest.


Mostrar siempre la información de un Marker


Cuando creamos un Marker en un mapa, no siempre muestra la información del marcador por defecto. Es decir, si tenemos el código siguiente, nos mostraría algo como lo que se ve en la imagen de abajo.

Marker miMaker=miMapa.addMarker(new MarkerOptions()
.position(lugar)
.title(title)
.snippet(info)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.escudo))
.anchor(0.5f,0.5f));


Entonces si queremos que se muestre la información del marcador debemos utilizar el método showInfoWindow(), quedando el código de la siguiente manera:

Marker miMaker=miMapa.addMarker(new MarkerOptions()
.position(lugar)
.title(title)
.snippet(info)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.escudo))
.anchor(0.5f,0.5f));
miMaker.showInfoWindow();

Ahora ya se vería la información del marcador cuando abrimos el mapa, sin tener que pulsar sobre dicho marcador.