miércoles, 22 de octubre de 2014

Emuladores Windows / Android

Si quieres utilizar tus juegos clásicos de Windows en tu dispositivo Android consulta este artículo de xatakandroid.com

Para instalar un simulador de Android en tu PC consulta este artículo de www.androidjefe.com

lunes, 15 de septiembre de 2014

Activar depuración en dispositivo móvil

Es necesario activar determinadas opciones del sistema para poder probar los proyectos de aplicaciones que se desarrollan en Eclipse desde un dispositivo móvil con Android instalado.

Para ejecutar las apps en un dispositivo móvil es necesario conectar el dispositivo al ordenador con un cable USB y habilitar la depuración USB en el dispositivo.

Habilitar la depuración USB en Jelly Bean (4.2 y 4.3) y Android KitKat (4.4)


Vamos a Ajustes> Información del Teléfono > pulsaremos varias veces sobre la opción Número de compilación y nos aparecerá un mensaje anunciando que ya somos desarrollador.

A partir de esta operación se agrega una opción a Ajustes llamada Opciones de Desarrollador, donde debemos entrar para activar la opción Depuración de USB.


Habilitar la depuración USB en Ice Cream Sandwich (4.0) y en Jelly Bean (4.1)


Vamos a Ajustes> Opciones para desarrolladores y la habilitamos. Una vez habilitada entramos y activamos la Depuración USB.

Habilitar la depuración USB en Android 2.3 Gingerbread y versiones anteriores


En este caso tan solo hace falta ir a Configuración>Aplicaciones> Desarrollo> y activar la opción Depuración USB

miércoles, 28 de mayo de 2014

Obtener información del tiempo de una localización concreta.

Conseguir el tiempo actual de un lugar concreto para una aplicación Android es muy simple y útil en muchos casos.

JSON es un código accesible en algunas webs que nos permite descargar datos actualizados mediante una URL determinada sin necesidad de descargarlos ni acceder a ellos por una base de datos. Estos datos pueden ser de clima, información de tráfico, música y otra información generalmente breve para realizar consultas concretas.

Para empezar creamos una clase JSONparser, que coja los datos JSON de una dirección y devuelva  objetos JSON.

NOTA: Esto y más detalles para empezar a trabajar con JSON en Android los puedes encontrar en http://www.learn2crack.com/2013/10/android-json-parsing-url-example.html

JSONParser.java
package learn2crack.jsonparsing.library;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
  static InputStream is = null;
  static JSONObject jObj = null;
  static String json = "";
  // constructor
  public JSONParser() {
  }
  public JSONObject getJSONFromUrl(String url) {
    // Making HTTP request
    try {
      // defaultHttpClient
      DefaultHttpClient httpClient = new DefaultHttpClient();
      HttpPost httpPost = new HttpPost(url);
      HttpResponse httpResponse = httpClient.execute(httpPost);
      HttpEntity httpEntity = httpResponse.getEntity();
      is = httpEntity.getContent();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      BufferedReader reader = new BufferedReader(new InputStreamReader(
          is, "iso-8859-1"), 8);
      StringBuilder sb = new StringBuilder();
      String line = null;
      while ((line = reader.readLine()) != null) {
        sb.append(line + "n");
      }
      is.close();
      json = sb.toString();
    } catch (Exception e) {
      Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    // try parse the string to a JSON object
    try {
      jObj = new JSONObject(json);
    } catch (JSONException e) {
      Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
    // return JSON String
    return jObj;
  }
}

Una vez hecho esto empezamos a buscar los datos que queremos en JSON. Para ello antes pondré un pequeño ejemplo de como hacerlo.

Pongamos que obtuviésemos este JSON:

{"tiempo": [{"id": "001","grados": "12","info":{"apariencia":"nublado","viento":"fuerte"}}]}

Los objetos serían los que van definidos entre comillas antes de los puntos suspensivos y después de ellos irían los datos. Los objetos pueden contener datos simples, como "id":"001", otros objetos entre llaves {} o arrays de objetos  definidos mediante corchetes [].

Para acceder a los objetos contenidos en un Array en Android usaríamos:

      JSONArray tiempo = json.getJSONArray("tiempo");
      JSONObject c = tiempo.getJSONObject(0);
      String grados= c.getString("grados");
      String grados= c.getString("id");

Para acceder a objetos incluidos en un objeto usaríamos:

      JSONArray tiempo = json.getJSONArray("tiempo");
      JSONObject c = tiempo.getJSONObject(0);
      JSONObject  info = c.getJSONObject("info");
      String apariencia= info.getString("apariencia");

En este ejemplo, como queremos acceder al tiempo de un lugar, usé esta API http://openweathermap.org/wiki/API/JSON_API, que permite, entre otras opciones, obtener el tiempo por un nombre de localización, sus coordenadas, los registros pasados y predicciones futuras, etc. 
Creamos un nuevo JSONParser y le añadimos la dirección de donde queremos que coja la dirección, por ejemplo http://api.openweathermap.org/data/2.1/find/name?q=vigo . En este caso le pido que me muestre la información a partir del nombre de la ciudad de Vigo "name?q=vigo"

JSONParser jParser = new JSONParser();
    JSONObject json = jParser.getJSONFromUrl("http://api.openweathermap.org/data/2.1/find/name?q=vigo");

Luego dentro de un "try" incluimos todas las operaciones para coger los datos que nos interesen y al cerrarlo añadimos un catch (JSONException e) y dentro un Log.d("MIO", e.getMessage()); Así podemos guiarnos en caso de que en alguna de las operaciones JSON cometamos un error.

Ya por último, con los datos del tiempo en variables, podríamos trabajar con ellos en nuestra aplicación.

viernes, 16 de mayo de 2014

Buscar Id de un recurso por su nombre

En algunas ocasiones nos puede interesar acceder al id de un recurso por su nombre, no por su localización. En muchos casos esto se puede deber a que tenemos el nombre almacenado en una variable o en un array. Cuando sea así una opción sencilla es la siguiente:

getResources().getIdentifier(<nombre del recurso>,<tipo de recurso: string, color, ...)>, <package: this.getPacktageName()>);

Aquí os muestro un ejemplo de la utilidad de este código:

Suponemos que tenemos tres botones, cada uno de ellos con el nombre de un color. Al pulsarlos queremos que cambie el fondo por el del color nombrado.

Para simplificar el código por si hay que añadir más botones, operaciones o hacer otros cambios, llamamos a una clase que haga la operación del cambio del color, enviándole el nombre del color elegido mediante un string.

public void cambiarColor(String colorEnviado)
{
RelativeLayout relativeLayout = (RelativeLayout)findViewById(R.id.layout);
relativeLayout.setBackgroundColor(getResources().getColor(getResources().getIdentifier(colorEnviado, "color", miContexto.getPackageName())));
}

Usando esta función cambiaría el color automáticamente del layout, sin necesidad de poner un "if" o un "case" para realizar una operación para cada color.

Y preguntareis, ¿por qué no hacer esto?:

public void cambiarColor(String colorEnviado)
{
RelativeLayout relativeLayout = (RelativeLayout)findViewById (R.id.layout);
relativeLayout.setBackgroundColor(getResources().getColor (R.color.colorEnviado));
}

La respuesta es porque este código daría error, ya que buscaría el recurso por el nombre de la variable, no por su contenido.

lunes, 21 de abril de 2014

Webs Responsive

Una Web Responsive es una Web que se adapta automáticamente su interfaz a todos los tamaños de pantalla (smartphone, tablets, pantallas de ordenador).

Las Webs Responsive pueden ser visualizadas en todos tipo de plataforma, IOS, Android, Windows, etc.

Las tecnologías a utilizar para crear Webs Responsive son: HTML5, CSS3, JavaScript/JQuery, etc.

Existen frameworks para crear interfaces Responsive como por ejemplo: Bootstrap, que está basado en HTML5 y CSS3.

Si quieres comprobar el funcionamiento de tu Web Responsive en distintos tamaños de pantalla, puedes utlizar este enlace
mattkersley.com/responsive/

Los siguientes ejemplos son Webs Responsive
http://thisisyoke.com/
http://foodsense.is/
http://webdesignerwall.com/
http://www.yiibu.com/
http://www.microsoft.com/es-es/default.aspx


miércoles, 9 de abril de 2014

Nuevo ADT Bundle (22.6.2) Problemas a la hora de crear un nuevo proyecto


PROBLEMAS EN LA CREACIÓN DE NUEVOS PROYECTOS

Con la última actualización del ADT Bundle (22.6.2), realizada el mes pasado, la comunidad de desarrolladores de Android está muy desconcertada pues han complicado la creación de nuevos proyectos sin grandes justificaciones.
En su empeño de convencer a los desarrolladores de que utilicen las últimas herramientas de Android (fragments, actionbar, etc.) han tomado una decisión drástica y nos obligan a incluirlas inicialmente. Estas nuevas herramientas están vigentes desde la API 11 y hasta la aparición de la API 19 de KitKat se mantenía la compatibilidad con una sencilla librería que se incluía en todos los proyectos (libs/android-support-v4.jar)
Con la versión del ADT Bundle 22.6.2 y el uso de la API 19, al crear un nuevo proyecto nos encontramos con varias dificultades:
1.       Se incorpora automáticamente un nuevo proyecto de tipo librería denominado appcompat_v7 que siempre contiene errores
2.       Obliga a utilizar fragments impidiendo que esta herramienta sea de uso opcional.
Para los desarrolladores Android experimentados esta situación no es más que una molestia pero para los que están empezando es una complicación innecesaria. Las personas que comienzan su aprendizaje no van a utilizar herramientas tan complejas como las que nos obliga la creación e nuevos proyectos.

PASOS A SEGUIR PARA CREAR UN NUEVO PROYECTO

Para superar las dificultades que se producen en la creación de nuevos proyectos y poder seguir el temario del curso, a continuación, os muestro los pasos que debéis seguir para crear un nuevo proyecto:

Ventanas-Opciones de la creación de un nuevo proyecto

 







Problemas a resolver con el proyecto-librería appcompat_v7

Si en el proyecto de librería creado se muestra una cruz roja como la del gráfico, analizaremos el contenido de la ventana Problems que se muestra en la parte de abajo del panel central de Eclipse.


En el caso de que en la ventana Problems se muestre un mensaje como el que he puesto encuadrado en la imagen anterior (The project cannot be built….), se deben seguir los siguientes pasos:
1.       Desplegar el contenido de la carpeta libs

2.       Sobre cada uno de los ficheros jar realizar las siguientes operaciones
a.       Pulsar el botón derecho sobre el fichero
b.      Build Path-Add to Buid Path


Ahora ya se debe mostrar el proyecto-librería appcompat_v7 sin errores

Pero el nuevo proyecto aun marca un error … lo solucionaremos en el siguiente punto…

Problemas a resolver con el proyecto nuevo creado


Si el nuevo proyecto marca un error y en la ventana Problems muestra un mensaje como el que aparece en la imagen debemos abrir el fichero MainActivity y eliminar las líneas enmarcadas


También podemos eliminar todos los métodos existentes en MainActivity que no sea onCreate(). Estos métodos son para manejar la action bar y los fragments y si no vamos a utilizar estas herramientas no los necesitamos
Así MainActivity quedaría con el siguiente código:



martes, 1 de abril de 2014

Diferencias entre la compilación en Java y en Android

Los ficheros de un proyecto Android se convierten en archivos .DEX, cuyo código puede ser interpretado por la máquina Dalvik (versión de la máquina virtual Java para Android)
 
En cambio, los pasos de conversión de ficheros antes de llegar a la JVM (Máquina Virtual de Java) es el siguiente:
 
 
Hay que tener en cuenta que el código Java se compila en ByteCodes que corren sobre cualquier JVM (Java Virtual Machine) estándar. 
Android no utiliza JVM, sino la máquina virtual llamada Dalvik que interpreta un bytecode diferente de la JVM estándar.
Para la programación de activities y otras clases en Android se utiliza el lenguaje Java estandar en lo que respecta a su sintásix, creación de clases, herencias, interfaces, etc. Pero el SDK de Android no contiene las mismas APIs que podemos encontrar en los distintos paquetes Java por ello no podemos utilizar, entre otros, java.awt o javax.swing.