Mostrando entradas con la etiqueta Android. Mostrar todas las entradas
Mostrando entradas con la etiqueta Android. Mostrar todas las entradas

viernes, 17 de julio de 2015

JSON en Android con PHP y MySQL

Para iniciarse con esto, una buena recomendación que les puedo dar es esta librería y empecemos.
Primero descargamos la librería , es un .jar:
Ahora en el paquete llamado app de nuestro árbol de archivos del proyecto:

Hacemos click derecho  y de ahí:
new->Module
y nos debe de lanzar a la siguiente ventana:
Y elegimos importar  .jar
Ahora nos lanzara a una ventana donde elegiremos la ruta de nuestro archivo .jar que descargamos de la pagina.
Ahora nos vamos a build.gradle (Module:app) y agregamos lo siguiente en dependencies:
compile 'com.loopj.android:android-async-http:1.4.7'
Y ahora veamos la pagina con la que vamos a interactuar en el servidor:
La tabla de la base de datos que consultaremos es:
Todo la comunicación la usaremos desde un método que llamaremos  ObtDatos(), lo que se va hacer es obtener los datos de apellido, edad  y puntos y los mostraremos en un listView,

public void ObtDatos()
    {
        AsyncHttpClient client=new AsyncHttpClient();
        String url="http://192.168.61.13/loggeo.php";
        RequestParams parametros= new RequestParams();
        EditText nombre=(EditText)findViewById(R.id.NombreLgoTxt);
        parametros.put("Nombre",nombre.getText().toString());

        client.post(url, parametros, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if (statusCode == 200) {
                    //Llamar a la funcion
                    CargarLista(obtDatosJSON(new String(responseBody)));
                    Log.i("Respuesta:", new String(responseBody));
                    Log.i("Datos:", "No Fallo");
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.i("Datos:", "Maldad: Fallo");
            }
        });
    }


CargarLista(obtDatosJSON(new String(responseBody))); nos va a llevar a cargar los datos obtenidos de la consulta del servidor en un listView:

public void CargarLista(ArrayList datos)
    {
        ListView listView=(ListView)findViewById(R.id.listViewLoggeo);
        ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,datos);
        listView.setAdapter(adapter);

    }

    public ArrayList obtDatosJSON(String resupesta)
    {
        ArrayList listado=new ArrayList<>();
        try
        {
            JSONObject jsonObject= new JSONObject(resupesta);
            String texto="Nombre="+jsonObject.getString("Nombre");
            listado.add(texto);

            texto="Apellido="+jsonObject.getString("Apellido");
            listado.add(texto);

            texto="Edad="+jsonObject.getString("Edad");
            listado.add(texto);

            texto="Puntos="+jsonObject.getString("Puntos");
            listado.add(texto);

        }catch (Exception error)
        {

        }
        return listado;
    }

Hacemos una interfaz parecida a esta:
Liga xml
Al correr la aplicación tendremos:

Espero les haya servido este  tutorial, por su atención gracias!

Fuentes:
https://www.youtube.com/watch?v=oLm_5GKHJCI  consultada el 16 de julio del 2015.

jueves, 16 de julio de 2015

SQLite en Android

SQLite es lo ideal cuando queremos trabajar con bases de datos en dispositivos móviles. Su uso es bastante sencillo, así que a continuación mostraremos una manera sencilla de manejo de base de datos en Android.
La base de datos que crearemos no tendra mucha dificultad, solo contendrá una sola tabla llamada Alumno, pongo la sintaxis en SQL:
 CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,
                         Nombre TEXT NOT NULL,
                         Telefono TEXT NOT NULL,
                         Carrera TEXT NOT NULL);

 Primero crearemos una clase llamada AlmacenBase.java
AlmacenBase.java


package com.example.ultron.practicabasedatos;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.Vector;

/**
 * Created by ultron on 13/07/15.
 */
public class AlmacenBase extends SQLiteOpenHelper {
    public AlmacenBase(Context context) {
        super(context,"AlumnosPro",null,1);
        /*
        Se manda al constructor de la clase padre para genera un entorno lógico de tu base de datos.
        Parametros:
        Contexto: Contexto de la aplicación
        Nombre de la base de datos
        Si se tiene un cursor que se puede utilizar como guia o referencia el objeto es cursorFactory, si no lo hay, null
        Número de versión
         */
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,Nombre TEXT NOT NULL, Telefono TEXT NOT NULL, Carrera TEXT);");
        /*
        Se sobreescribe el metodo onCreate de la clase padre esto con la
        intención de tener una estructura lógica de la base, en memoria ya se creo,
        pero aun no esta almacenada en el teléfono.
         */
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Control de versiones de la base de datos
    }


}

Ahora crearemos la clase DataBaseManager.java que servirá como ayudante en el manejo de la base de datos.
DataBaseManager.java


package com.example.ultron.practicabasedatos;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.io.File;

/**
 * Created by ultron on 13/07/15.
 */
public class DataBaseManager {

  //****Clase para administrar la base de datos con la que trabajaremos****//
    /*
    Tablas de la base de datos:
    CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,
                         Nombre TEXT NOT NULL,
                         Telefono TEXT NOT NULL,
                         Carrera TEXT NOT NULL);
     */
    String nombre="Nombre",telefono="Telefono",carrera="Carrera",codigo="Codigo";//Variables que serviran como referencias a los atributos de la tabla Alumnos
    AlmacenBase helper; //Clase que realiza la conexion
    SQLiteDatabase db; //Objeto que nos sirve como enlace lógico con la base de datos
    public DataBaseManager(Context context)
    {
        helper=new AlmacenBase(context); //Se crea el objeto de conexion
        db=helper.getWritableDatabase();//Si no existe la base se crea y si existe se habre en modo escritura
    }

    public ContentValues generaContenedorAlumno(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        Contenedor que genera un diccionario para los atributos a ingresar a la base de datos
        Un diccionario solo son tublas de elementos con algun significado, en este caso lo estructuramos
        con los parametros que recibimos.
         */
        ContentValues valores=new ContentValues();
        valores.put(codigo,Integer.toString(codigoP));
        valores.put(nombre,nombreP);
        valores.put(telefono,telefonoP);
        valores.put(carrera,carreraP);
        return valores;
    }

    public void insertar(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        La inserción de registros a la tabla se realiza con un metodo ya establecido de la clase SQLiteDatabase
        llamado insert, es conveniente y recomendable hacerlo por su facilidad de uso sus parametros:
        Tabla:El nombre de la tabla en la que se realizara la inserción.
        nullColumnHack: El nombre de la o las columnas donde se recibiran valores null, si no los hay, mandar null.
        valores: Los valores, mapeados en un ContentValue para su simplicidad

        El método retornara el ID de la ultima fila insertada se se realizo con exito, de lo contrario
        retornara -1
         */
        //TABLADestino null ContentValues
        db.insert("Alumno", null, generaContenedorAlumno(codigoP, nombreP, telefonoP, carreraP));
    }

    public  void eliminar(int codigoP)
    {
        /*
        Metodo establecido de SQLiteDatabase para eliminar registros:
        Parametros:
        Tabla: La tabla afectada
        Clausula Where: Campo =?   ---->WHERE Campo=
        Argumentos del Where: Como pueden ser varios se utiliza un arreglo de Strings

         */
        //TABLADESTINO  
        db.delete("Alumno", codigo + "=?", new String[]{Integer.toString(codigoP)});
    }

    public void actualiza(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        Método para actualizar las filas,
        recibe como parametros:
        Tabla: Tabla afectada.
        Valores: ContentValue con la lista de los valores de la tabla, junto los no actualizados, como si se realisase una insercion.
        Clausula Where: Campo =?   ---->WHERE Campo=
        Argumentos del Where:Como pueden ser varios se utiliza un arreglo de Strings

        Retornara el numero de filas afectadas.
         */
        //TABLADESTINO   
        db.update("Alumno", generaContenedorAlumno(codigoP, nombreP, telefonoP, carreraP), codigo + "=?", new String[]{Integer.toString(codigoP)});
    }
    public Cursor buscar(int codigoP)
    {
        /*
        Este método retornara un Cursor con el resultado de la consulta, los parametros son:
         Tabla: Nombre de la tabla afectada.
         Columns: La lista de las columnas requeridas en un arreglo de Strings
         Selección o condición: Columna =?  -----> WHERE Columna=
         Argumentos de la condición: Arreglo de Strings de los campos a usar como referencia
         groupBy
         having
         orderBy
         limit
         */

        /*****Un Cursor es un contenedor de resultados random para resultados de Querys en SQL*****/
        //TABLABUSQUEDA DATOS_REQUERIDOS  
        String[] columnas=new String[]{codigo,nombre,telefono,carrera};
        return db.query("Alumno",columnas,codigo + "=?",new String[]{Integer.toString(codigoP)},null,null,null,null);
    }

    public void EliminarBase()
    {
        /*
        Para eliminar la base de datos se tiene que hacer un enlace lógico con el directorio de la base
        para eso se pide el directorio con getPath.
        directorio es el enlace lógico.
        deleteDatabase eliminara la base si directorio es diferente de null.
        Retornara true si se concreto la operación, false en caso contrario.
         */
        final String path=db.getPath();
        File directorio=new File(path);
        db.deleteDatabase(directorio);
    }
}


Terminada la creación de estas bases de datos que son esenciales para el funcionamiento de nuestra app, lo siguiente es crear la primera actividad llamada "Agregar.java". Esta actividad servira para agregar registros a nuestra base.
Agregar.java


package com.example.ultron.practicabasedatos;

import android.media.MediaDescription;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Agregar extends ActionBarActivity {

    AlmacenBase Base;
    EditText nombreTxt,telefonoTxt,CarreraTxt,CodigoTxt;
    Button agregarBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_agregar);

        //Referencias al layout
       nombreTxt=(EditText)findViewById(R.id.NombreTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoTxt);
        CarreraTxt=(EditText)findViewById(R.id.CarreraTxt);
        CodigoTxt=(EditText)findViewById(R.id.CodigoTxt);

       agregarBtn=(Button)findViewById(R.id.AgregarAlumnoBtn);

         agregarBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());//Manager de la base de datos
                String nombre=nombreTxt.getText().toString();
                String telefono=telefonoTxt.getText().toString();
                String codigo=CodigoTxt.getText().toString();
                String carrera=CarreraTxt.getText().toString();

                int CodigoEnt=Integer.parseInt(codigo);


                dbm.insertar(CodigoEnt,nombre,telefono,carrera);//Insercion en la base de datos
                nombreTxt.setText("");
                telefonoTxt.setText("");
                CodigoTxt.setText("");
                CarreraTxt.setText("");
                //Limpiamos formulario
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_agregar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


Ahora nos dirigimos al  layout, al activity_agregar.xml por cuestiones de espacio no subiré los xml de la aplicación puedes descargarlos de este link para que te des una idea de como sera diseñada la aplicación.

Ahora crearemos la activity Buscar.java
Buscar.java
package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.StringTokenizer;


public class Buscar extends ActionBarActivity {
    AlmacenBase Base;
    Button buscar;
    int Codigo;
    EditText CajaCodigo;
    TextView nombreTV,telefonoTV,carreraTV;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buscar);

        //Referencias al layout
        buscar=(Button)findViewById(R.id.BuscarBtn);
        CajaCodigo=(EditText)findViewById(R.id.CodigoTxt);
        telefonoTV=(TextView)findViewById(R.id.MuestraTelefonolbl);
        nombreTV=(TextView)findViewById(R.id.MuestraNombreLbl);
        carreraTV=(TextView)findViewById(R.id.MuestraCarreraLbl);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            DataBaseManager dbm=new DataBaseManager(getApplicationContext());//Manager para la base de datos
            Codigo=Integer.parseInt(CajaCodigo.getText().toString());//Se obtiene el codigo
                Cursor res=dbm.buscar(Codigo);//Buscamos resultados
                if(res!=null)
                {
                    //Mostramos resultados de la query
                    res.moveToNext();
                    nombreTV.setText("");
                    nombreTV.setText(res.getString(1).toString());

                    telefonoTV.setText("");
                    telefonoTV.setText(res.getString(2).toString());

                    carreraTV.setText("");
                    carreraTV.setText(res.getString(3).toString());
                }

            }
        });
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_buscar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

En seguida creamos la activity Modificar.java
Modificar.java

package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Modificar extends ActionBarActivity {

    Button buscar,actualizar;
    int Codigo;
    EditText nombreTxt,telefonoTxt,carreraTxt,codigoTxt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_modificar);

        nombreTxt=(EditText)findViewById(R.id.NombreModTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoModTxt);
        carreraTxt=(EditText)findViewById(R.id.CarreraModTxt);
        buscar=(Button)findViewById(R.id.BuscarBtn);
        actualizar=(Button)findViewById(R.id.ActualizarBtn);
        codigoTxt=(EditText)findViewById(R.id.CodigoModTxt);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());
                Codigo=Integer.parseInt(codigoTxt.getText().toString());
                Cursor res=dbm.buscar(Codigo);
                if(res!=null)
                {
                    res.moveToNext();
                    nombreTxt.setText("");
                    nombreTxt.setText(res.getString(1).toString());

                    telefonoTxt.setText("");
                    telefonoTxt.setText(res.getString(2).toString());

                    carreraTxt.setText("");
                    carreraTxt.setText(res.getString(3).toString());
                }

            }
        });

        actualizar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());
                int codigo=Integer.parseInt(codigoTxt.getText().toString());
                String nombre=nombreTxt.getText().toString();
                String telefono=telefonoTxt.getText().toString();
                String carrera=carreraTxt.getText().toString();
                dbm.actualiza(codigo,nombre,telefono,carrera);

                nombreTxt.setText("");
                telefonoTxt.setText("");
                carreraTxt.setText("");
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_modificar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Ya casi para terminar el Eliminar.java
Eliminar.java


package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Eliminar extends ActionBarActivity {

    EditText nombreTxt,telefonoTxt,carreraTxt,codigoTxt;
    Button buscar,eliminar;
    int Codigo=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eliminar);

        /*
        Referenciamos los elementos del Layout con la clase de java
         */
        nombreTxt=(EditText)findViewById(R.id.NombreElTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoElTxt);
        carreraTxt=(EditText)findViewById(R.id.CarreraElTxt);
        buscar=(Button)findViewById(R.id.BuscarElBtn);
        eliminar=(Button)findViewById(R.id.EliminarElBtn);
        codigoTxt=(EditText)findViewById(R.id.CodigoElTxt);
        /*
        Primero hay que buscar el elemento que se desea eliminar.
         */
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm = new DataBaseManager(getApplicationContext());//Se invoca a la clase que nos guia a travez de la base de datos
                Codigo = Integer.parseInt(codigoTxt.getText().toString());//Obtenemos el codigo
                Cursor res = dbm.buscar(Codigo);//Buscamos el elemento segun el codigo ingresado
                if (res != null) {
                    //Mostramos resultados
                    res.moveToNext();
                    nombreTxt.setText("");
                    nombreTxt.setText(res.getString(1).toString());

                    telefonoTxt.setText("");
                    telefonoTxt.setText(res.getString(2).toString());

                    carreraTxt.setText("");
                    carreraTxt.setText(res.getString(3).toString());
                }

            }
        });

        eliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm = new DataBaseManager(getApplicationContext());//Se declara el manager de la base de datos
                dbm.eliminar(Codigo);//Eliminamos usando el codigo como parametro
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_eliminar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Por ultimo nos vamos a nuestro MainActivity.java
MainActivity.java


package com.example.ultron.practicabasedatos;

import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {
    Button agregar,buscar,modificar,eliminar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DataBaseManager dbm=new DataBaseManager(this);
        agregar=(Button)findViewById(R.id.AgregarBtn);
        buscar=(Button)findViewById(R.id.BuscarBtn);
        modificar=(Button)findViewById(R.id.ModificarBtn);
        eliminar=(Button)findViewById(R.id.EliminarBtn);

        agregar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Agregar.class);
                startActivity(i);


            }
        });

        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Buscar.class);
                startActivity(i);


            }
        });

        modificar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Modificar.class);
                startActivity(i);


            }
        });

        eliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Eliminar.class);
                startActivity(i);


            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


Ahora en nuestro AndroidManifest.xml agregamos el permiso de escritura y lectura en almacenamiento externo.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Y nuestra aplicación se tiene que ver así:





Google Maps en Android

Hola, vamos a hacer una aplicación usando el API de google maps.
Primero crearemos el proyecto.
A continuación elegiremos la versión de android con la que trabajaremos.
Ahora elegiremos la Activity de mapas que se nos da por defecto.

Le asignamos el nombre que deseemos.
Y nos posicionamos en google_maps_api.xml, en su proyecto esta en la carpeta de values.

De aquí seleccionamos el link que viene en los comentarios y  accedemos a el en nuestro navegador, es la linea completa solo tache información de las direcciones y claves que se generan por desarrollador.
En la pagina solo crearemos las credenciales, solo es cuestión de aceptar términos y condiciones y dar siguiente, y nos mandara a una pagina que contendrá una tabla como esta:
Esta clave nos sirve para muchas aplicaciones pero se distribuye por desarrollador, no la podemos pasar a otras personas, por si hicieran mal uso de esto. Lo siguiente es copiar la clave que esta en la columna derecha la tabla que les mostré, la "Calve de la API". Solo seleccionamos y copiamos.
Ahora nos vamos a google_maps_api.xml de nuestro proyecto.

Aquí lo que haremos es sustituir la leyenda "YOUR KEY_HERE" por la clave de la API que acabamos de copiar.

Y ahora nos dirigimos a la clase MapsActivity.java y  nos aseguramos que nuestro código se asemeje a este:

package com.example.ultron.practicamapasauge; //Aqui es el nombre del paquete de su proyecto

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync((OnMapReadyCallback) this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {
       if (mMap == null) {
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            if (mMap != null) {

            }
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng CUCEI = new LatLng(20.656945, -103.324512); //Enviamos coordenadas de nuestro objeto de latitudes
        googleMap.addMarker(new MarkerOptions().position(CUCEI).title("CUCEI"));//Agregamos la marca con su titulo
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(CUCEI));//Movemos la camara a donde correspone la marca que hicimos.
    }
}

Ya teniendo esto, corremos nuestra aplicación y lo que debe de aparecernos en nuestra pantalla es lo siguiente:
Pueden agregar cuantas marcas ustedes deseen en el metodo onMapReady.

Para obtener las latitudes de un sitio, solo se van a Maps y buscan el sitio al que desean hacer referencia en su aplicación.

Damos click derecho sobre la marca.

Y elegimos la opción ¿Que hay aquí?
Y nos devolverá las latitudes del sitio del marcador, las copiamos y las llevamos al objeto LatLng que usaremos para la respectiva marca.
Espero les sea de utilidad este tutorial, gracias por su atención.

Fuentes:
https://developers.google.com/maps/documentation/android/start consultada el 16 de julio del 2015

domingo, 12 de julio de 2015

El coleccionista de los huevos de pascua. Android

Desbloquear logro secreto de Play Juegos.
Primero hay que ubicar esta aplicación en el menú general.

Después vamos a tocar la pantalla del celular con el dedo y vamos a moverlo en la siguiente secuencia.
Y enseguida saldra el siguiente teclado a un paso de terminar de desbloquear este logro!
Y de aquí presionemos la siguiente secuencia "B" -> "A" -> Play
En seguida desbloquearemos el logro! saldrá una notificación de este hecho. Solo se activa la notificación,  lo único que produce esto ademas de la notificación, es la satisfacción de haberlo hecho :D

Sorpresa de versión.
Cada versión de android tiene una pequeña sorpresa integrada y no es muy difícil acceder a ella. Ustedes saben los programadores somos muy divertidos ( :D ).
Primero debemos ubicar ajustes.

De aquí buscamos la opción de "Acerca del teléfono"
De aquí nos desplegara algo de información, buscamos la versión de nuestro android.
Y presionamos repetidamente la versión.
Salen diferentes cosas, según la versión, en mi caso sale este gran 2. Hay que hacerle click y no levantar el dedo con el que estemos haciendo click.
En seguida aparece esto en mi versión, repito en todas es diferente, he ahí el atractivo.
De igual manera mantenemos presionado el centro del letrero de android y nos llevara a esta fabulosa caja de postres, es un juego - animación muy peculiar y adictiva.