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

domingo, 2 de abril de 2017

Como hacer un splash screen en android studio

Hola a todos hoy veremos un tutorial de como hacer un SPLASH SCREEN en android personalmente a mi me gusta este tipo de artículos, porque de alguna forma te enseñan a mejorar la estética de tu producto final, hay un dicho entre programadores,  "los que programan diseñan mal" y eso no es cierto si bien es verdad que en países avanzados existe un sujeto para cada trabajo, en Latinoamerica una sola persona es analista,diseñadora,programador, marketero etc de cosas y si bien es cierto esto genera muchas veces que las cosas se hagan a medias un programador que desarrolle mas de una actitud siempre hará bien su trabajo, con esto te digo que no debes hacer 20 cosas tu mismo porque nunca seras bueno en todo pero al menos puedes programar y hacer interfaces amigables para tus usuario.




Que es un Splash Screen?

No vamos hacer técnicos en la definición, Te has dado cuenta que cuando descargas alguna aplicación  y le das en ejecutar y carga hermosas entradas antes de ejecutarse "eso es un Splash Screen" te dejo algunos ejemplos en las siguientes imágenes:




Bien sin mas rodeos empezamos, hay muchas formas de hacerla pero en este tuto amantes delas frutas y los fragment, lo haremos con fragment :)
utilizaremos 3 layouts y 3 clases y para hacer los efectos del Splash Screen 2 layout en la carpeta animator.

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/contenedor"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

</FrameLayout>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

}


fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Bienvenidos!!"
        android:textSize="60sp" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/logo1"
        android:layout_marginTop="110dp"
        android:id="@+id/imageView3"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true" />

</RelativeLayout>


MainFragment.java

public class MainFragment extends Fragment {

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
  return inflater.inflate(R.layout.fragment_main, container, false);
 }

}


fragment_splash_screen

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashScreenFragment" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/app_name"
        android:scaleType="fitXY"
        android:src="@drawable/cereza1" />

</RelativeLayout>


SplashScreenFragment.java

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashScreenFragment" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/app_name"
        android:scaleType="fitXY"
        android:src="@drawable/cereza1" />

</RelativeLayout>

Bien ahora debemos crear la carpeta animator dentro de la carpeta res no puede ser otro nombre o no lo reconocerá android studio.
Dentro de nuestra carpeta animator crearemos dos layout y serán los siguientes:


salir_a_la_izquierda_xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Rotate. -->
    <objectAnimator
        android:duration="10"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="0"
        android:valueTo="180" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="10"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

</set>


voltear_a_la_izquierda.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Before rotating, immediately set the alpha to 0. -->
    <objectAnimator
        android:duration="0"
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

    <!-- Rotate. -->
    <objectAnimator
        android:duration="100"
        android:propertyName="rotationY"
        android:valueFrom="-180"
        android:valueTo="0" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="10"
        android:valueFrom="0.0"
        android:valueTo="1.0" />

</set>


en la carpeta drawable debe ir la imagen de nuestro Splash Screen, les dejo la del ejemplo




Dentro de la carpeta values debemos agregar un archivo llamado color.xml y tendrá lo siguiente:

color.xml 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>

También modificaremos nuestro archivo styles y debe quedar de la siguiente forma:

style.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>


Y con eso hemos terminado este tutorial, espero les sirva y no se olviden de comentar cualquier duda.


Igual si piensas que hablo escribo en chino te dejo el ejercicio:

  Link de la descarga
Programador alfa, lomo plateado, barba de clavos, mentón de roca, no descarga la aplicación sigue el tutorial. Clic para DESCARGAR

     
ENLACES DE INTERÉS:

lunes, 27 de marzo de 2017

Cómo personalizar listas (ListView) en Android Studio

¿Quieres personalizar listas o listView en Android Studio? cuando yo inicie en la programación con android e implante mi primer ListView y compare con otros ejercicios de programadores mas avanzados me di cuenta que el mio era una porquería jajaja y por entonces no había muchas guías y recuerdo que se trabaja en eclipse, entonces en honor a ese recuerdo hoy te voy a enseñar una bonita forma de crear listas más personalizadas y con un estilo propio, alejándonos de las clásicas listas de Android Studio. Además, esto nos permitirá añadir imágenes o botones entre muchas otras cosas a las listas.

Después de haber visto cómo lanzar un segundo activity, crear un adapter personalizado en Android Studio será como comer pizza gratis, así que vamos a ver cómo crearlos.

Crear lista/adapter personalizado en Android Studio

Para crear un adapter personalizado, y muy básico, en Android vamos a ver un sencillo ejemplo con una lista de frutas en la que mostraremos un ImageView y un TextView.

Primero te aconsejo crear un nuevo proyecto para no tener problemas con otras clases y después lo puedes portar a dónde tú quieras. Para que te hagas una idea, el resultado final sería algo como esto, un ejemplo de lista personalizada en Android Studio.

LISTA (LISTVIEW) PERSONALIZADA EN ANDROID STUDIO


PASO 1: Tenemos que ir a nuestro activity_main.xml e insertar un texView para el titulo y un listView para mostrar la lista y se vera de la siguiente forma

.

Y el código seria el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.androidmorefast.pc.appdiseniolistview.MainActivity"
    android:orientation="vertical">

    <TextView
        android:text="LISTA DE FRUTAS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24dp"
        android:textStyle="bold"
        android:id="@+id/textView" />

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/lvListado" />
</LinearLayout>


Ahora debemos crear un archivo layout que nos servirá para modelar mejor el diseño de la lista,
la creamos de la siguiente forma: clic sobre layout--new--Layout resource file como se muestra en la siguiente imagen

                           Clic en la imagen para agrandar


Este nuevo layout le pondremos de nombre lista_frutas.xml dentro de el ira un texView y una imageView

CÓDIGO:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imgFrutas"
        android:layout_gravity="center"
        android:layout_width="48dp"
        android:layout_height="48dp" />

    <TextView
        android:id="@+id/textView"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25dp"
        android:text="textView" />

</LinearLayout> 
PASO 2: Ahora nos toca trabajar con nuestras clases, así que iremos primero a nuestro MainActivity.java y tendrá el siguiente código:

public class MainActivity extends Activity {

    ListView lista;
    Context context;

    ArrayList prgmNombre;
    public static int [] prgmImages={R.drawable.banana,R.drawable.coco,
        R.drawable.manzana,R.drawable.pera,R.drawable.sandia,R.drawable.uva};
    public static String [] progNombreLista={"BANANA","COCO++","MANZANA","PERA",
                                          "SANDIA","UVA"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context=this;

        lista=(ListView) findViewById(R.id.lvListado);
        lista.setAdapter(new GestionarAdapter(this, progNombreLista,prgmImages));

    }

}
Ahora también debemos crear una nueva clase java a la cual llamaremos GestionarAdapter.java  se crea de la siguiente forma como se muestra en la imagen:



y tendrá el siguiente código:

public class GestionarAdapter extends BaseAdapter {
    String[] resultado;
    int[] imgId;
    Context contexto;

    private static LayoutInflater inflater= null;
    public GestionarAdapter (MainActivity mainActivity,String[]progNombreLista,int[]progImg) {
        resultado = progNombreLista;
        contexto = mainActivity;
        imgId = progImg;
        inflater = (LayoutInflater) contexto.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

          }
    @Override
        public int getCount(){
           return resultado.length;
        }
    @Override
        public  Object getItem(int posicion) {
            return posicion;
        }
    @Override
       public  long  getItemId(int posicion) {
        return posicion;
        }
    public class Holder
    {
        TextView tv;
        ImageView img;
    }
    @Override
    public View getView(final int posicion, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder=new Holder();
        View fila;
        fila = inflater.inflate(R.layout.lista_frutas, null);
        holder.tv=(TextView) fila.findViewById(R.id.textView);
        holder.img=(ImageView) fila.findViewById(R.id.imgFrutas);
        holder.tv.setText(resultado[posicion]);
        holder.img.setImageResource(imgId[posicion]);
        fila.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(contexto, "Seleccionaste "+resultado[posicion],
                 Toast.LENGTH_LONG).show();
            }
        });
        return fila;
    }

}


Bien y con eso hemos terminado, espero les ayude a mejorar sus ejercicios y futuros proyectos.

 Link de la descarga
Programador alfa, lomo plateado, barba de clavos, mentón de roca, no descarga la aplicación sigue el tutorial. Clic para DESCARGAR

     
ENLACES DE INTERÉS:

jueves, 23 de marzo de 2017

Politicas de privacidad para android.permission


Bueno hace tiempo dije algunos usuarios que escribiría algo al respecto pero me he tardado mas de la cuenta así que hoy es el gran día, supongo que cuando estaba por aya por el 2015 usaban librerías de google map o alguna una que te permitía utilizar parte del celular o software directo de google simplemente agregabas permisos como estos:

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

Y con eso bastaba, pero bueno google ha cambiado sus políticas, las causas son muchas, pero las mas graves es que muchos malos desarolladores han estado ingresando código malicioso para jodernos la vida y es así que te espiaban con la cámara o algún novi@ enfermo sabia tu ubicación sin que lo supieras, ahora estas políticas de android.permission no son mas que validaciones que lanzan un mensaje al usuario final diciéndole que la aplicación quiere usar por ejemplo su cámara y si esta de acuerdo con ello, a mi me parece genial que google haga eso pero esos malos programadores seguro que conseguirán otra forma de jodernos la vida, así que no renieguen por tener que agregar un par de lineas mas a su código.
Para requerir permisos:

Requerir permisos en Android 6.0 o posterior.
Este sería la forma de requerir permisos para poder obtener información de contactos en Android 6.0 

int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.GET_ACCOUNTS);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        Log.i("Mensaje", "No se tiene permiso para obtener información de contactos.");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.GET_ACCOUNTS}, 225);
    } else {
        Log.i("Mensaje", "Se tiene permiso!");
    }

Para empaparte mas al respecto sobre el tema te aconsejo que revise el siguiente enlace donde seguramente todas tus dudas se despejaran haciendo clic Aquí.





Como obtener coordenadas del gps y luego pasarlo a Google Maps en android studio

Hola amigos y amigas programadores en android, hoy veremos un tutorial de Como obtener coordenadas del gps y luego pasarlo a Google Maps en android studio a pedido de un usuario que ha tenido problemas al implementarlo. Primero les comento que este ejercicio requiere conocimientos muy avanzados, así que te pondré como referencia algunos ejemplos que hemos visto hasta ahora según su grado de dificultad de menos a mas, así podrás revisarlos y despejar todas tus dudas.


Bien empecemos con el tutorial vamos a trabajar sobre tres clases uno para gestionar nuestras coordenadas y en otro mostraremos un mapa y nuestra posición y dejaremos la clase MainActivity solo como intro de carga para la aplicación, la idea de este ejercicio es que se obtenga las coordenadas y mostrarlas en un textview luego pasaremos esas coordenadas por nuestro Fragment Map y mostraremos nuestras posiciones. El producto final seria algo como muestro en las siguientes imágenes:

     



Entonces como de costumbre empezamos con los permiso:

Nuestro AndroidManifest debe quedar de la siguiente forma no olviden poner su api key en el meta-data que esta al final.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.androidmorefast.pc.appmostrardireccionmapa">

    <!-- For Map -->

    <permission
        android:name="com.androidmorefast.pc.appmostrardireccionmapa.permission.MAPS_RECEIVE"        android:protectionLevel="signature" />

    <uses-permission android:name="com.androidmorefast.pc.appmostrardireccionmapa.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <!-- Internet Permissions -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="Aquí pones tu Api Key" />
        <activity android:name=".GestionarCoordenada" />
        <activity android:name=".MapasActivity"></activity>
    </application>

</manifest>

Ahora debemos ir a nuestro buil.gradle y agregar las siguiente librerías:


dependencies {
    compile 'com.google.android.gms:play-services-location:9.8.0'
    compile 'com.google.android.gms:play-services-maps:9.8.0'
    compile 'com.google.maps.android:android-maps-utils:0.4'
}

Ahora si empezamos a trabajar, como dijimos al principio el MainActivity nos servirá solo de intro, así que pasamos a configurarlo de forma rápida
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:id="@+id/activity_coordenadas"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@drawable/start"
       tools:context="com.androidmorefast.pc.appmostrardireccionmapa.MainActivity">

    </RelativeLayout>

MainActivity.Java
public class MainActivity extends Activity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout layout = (RelativeLayout) findViewById(R.id.activity_coordenadas);
        layout.setOnClickListener(this);
        }

@Override
public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, GestionarCoordenada.class);
        startActivity(i);
        }
}


Ahora debemos empezar con nuestra clase GestionarCoordenada, recuerden que aqui lo que vamos hacer es obtener las coordenadas tanto latitud como longitud y luego las convertiremos para mostrarla en el mapa. Primero crearemos nuestra interface en nuestro leyout que constara en dos texview, dos editext y dos botones y luego la configuramemos su clase.
Para obtener esta interface:

activity_gestionar_coordenada.xml
<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.androidmorefast.pc.appmostrardireccionmapa.GestionarCoordenada"
    android:background="#16631f">
        <Button
            android:id="@+id/btnAtualizarUbicacion"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="25dp"
            android:layout_marginTop="50dp"
            android:background="@color/colorPrimary"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:text="@string/btn_actualizacion_ubicacion"
            android:textColor="@color/common_google_signin_btn_text_dark_default"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/btnAtualizarUbicacion"
            android:layout_marginTop="25dp"
            android:layout_marginBottom="25dp"
            android:id="@+id/relativeLayout1"
            android:orientation="vertical">
            <View
                android:id="@+id/anchor1"
                android:layout_width="1dip"
                android:layout_height="0dp"
                android:layout_centerInParent="true" />
            <TextView
                android:text="Latitude"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/anchor1"
                android:textColor="@color/common_google_signin_btn_text_dark_default"
                android:textSize="16dp" />

            <TextView
                android:id="@+id/txtLatitude"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/anchor1"
                android:textColor="@color/common_google_signin_btn_text_dark_default"
                android:textSize="16dp" />
        </RelativeLayout>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/relativeLayout1"
            android:layout_marginTop="25dp"
            android:layout_marginBottom="25dp"
            android:id="@+id/relativeLayout2"
            android:orientation="vertical">
            <View
                android:id="@+id/anchor2"
                android:layout_width="1dip"
                android:layout_height="0dp"
                android:layout_centerInParent="true" />
            <TextView
                android:text="Longitude"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/anchor2"
                android:textColor="@color/common_google_signin_btn_text_dark_default"
                android:textSize="16dp" />
            <TextView
                android:id="@+id/txtLongitude"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/anchor2"
                android:textColor="@color/common_google_signin_btn_text_dark_default"
                android:textSize="16dp" />


        </RelativeLayout>
        <Button
            android:id="@+id/btnVerMapa"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="50dp"
            android:layout_below="@+id/relativeLayout2"
            android:background="@color/colorPrimary"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:text="Ver tu posición en el mapa"
            android:textColor="@color/common_google_signin_btn_text_dark_default"/>
    </RelativeLayout>





GestionarCoordenada.java
public class GestionarCoordenada extends Activity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,LocationListener {

    private static final String TAG = GestionarCoordenada.class.getSimpleName();
    private TextView lat, lng;
    private Button obtenerUbicacion, verMapa;
    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000;
    private Location mLastLocation;
    private GoogleApiClient mGoogleApiClient;
    private boolean mRequestLocationUpdates = false;
    private LocationRequest mLocationRequest;
    private static int UPDATE_INTERVAL = 10000;
    private static int FATEST_INTERVAL = 5000;
    private static int DISPLACEMENT = 10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gestionar_coordenada);

        obtenerUbicacion = (Button) findViewById(R.id.btnAtualizarUbicacion);
        verMapa = (Button) findViewById(R.id.btnVerMapa);
        lat = (TextView) findViewById(R.id.txtLatitude);
        lng = (TextView) findViewById(R.id.txtLongitude);
        if (checkPlayServices()) {
            buildGoogleApiClient();
            createLocationRequest();
        }
        obtenerUbicacion.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                togglePeriodLocationUpdates();

            }
        });

        verMapa.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(GestionarCoordenada.this, MapasActivity.class);
                startActivity(i);
                finish();
            }
        });

    }


    @Override
    protected void onStart() {
        super.onStart();
        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
            displayLocation();
            Log.d("onStart ", "GoogleApiClient se ha creado");
        }
    }


    @Override
    protected void onResume() {
        super.onResume();
        checkPlayServices();
        if (mGoogleApiClient.isConnected() && mRequestLocationUpdates) {
            startLocationUpdates();
        }
    }


    @Override
    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        stopLocationUpdates();
    }


    private void displayLocation() {


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    Activity#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for Activity#requestPermissions for more details.
                return;
            }
        }else{
            //Do Your Stuff

        }
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        Log.d("Ultima Ubicación ", "encontrada");
        if (mLastLocation != null) {
            double latitude = mLastLocation.getLatitude();
            double longitude = mLastLocation.getLongitude();
            lat.setText(latitude + "");
            lng.setText(longitude + "");

        } else {
            lat.setText("0.0");
            lng.setText("0.0");
        }


    }


    private void togglePeriodLocationUpdates() {
        if (!mRequestLocationUpdates) {
            obtenerUbicacion.setText(getString(R.string.btn_detener_actualizaciones));

            mRequestLocationUpdates = true;

            startLocationUpdates();

        } else {
            obtenerUbicacion.setText(getString(R.string.btn_actualizacion_ubicacion));

            mRequestLocationUpdates = false;

            stopLocationUpdates();
        }
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();
        Log.d("GoogleApiClient ", " se ha creado");
    }

    protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        mLocationRequest.setFastestInterval(FATEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
        Log.d("Solicitud de ubicacion", " es creado");
    }

    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                Log.i(TAG, "Este dispositivo no es compatible.");
                finish();
            }
            return false;
        }
        return true;
    }


    protected void startLocationUpdates() {


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    Activity#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for Activity#requestPermissions for more details.
                return;
            }
        }else{
            //Do Your Stuff

        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        Log.d("La ubicacion ", "esta actualizada");
    }

    protected void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        displayLocation();
        if (mRequestLocationUpdates) {
            startLocationUpdates();
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        mGoogleApiClient.connect();
    }




    @Override
    public void onLocationChanged(Location location) {
        mLastLocation = location;

        Toast.makeText(getApplicationContext(), "Ubicación cambiada!", Toast.LENGTH_SHORT).show();

        displayLocation();
    }
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.i(TAG, "Conexion fallida: " + connectionResult.getErrorCode());
    }

}

Ahora nos toca ver la configuración del mapa donde vamos a mostrar las coordenadas que obtuvimos con nuestra clase anterior, debemos crear un MapFragment  y debe quedar como la siguiente imagen:


activity_mapas.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.androidmorefast.pc.appmostrardireccionmapa.MapasActivity">

    <Button
        android:id="@+id/btnRegresar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal|center_vertical"
        android:text="Volver a la página anterior"
        android:layout_weight="1"
        android:background="#16631f"
        android:textColor="@color/common_google_signin_btn_text_dark_default"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>


MapasActivity.java
public class MapasActivity  extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private Location mCurrentLocation;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    private GoogleMap mMap;
    private String mLastUpdateTime;
    private static final long INTERVAL = 1000 * 60 * 1; //1 minuto
    private static final long FASTEST_INTERVAL = 1000 * 60 * 1; // 1 minuto
    private static final float SMALLEST_DISPLACEMENT = 0.15F; //con esto obtenemos desplazamiento minimo "un cuarto de metro"
    private ProgressDialog pDialog;
    private Button back;
    private static final String TAG = MapasActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mapas);

        back = (Button) findViewById(R.id.btnRegresar);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkLocationPermission();
        }
        // Obteniendo el SupportMapFragment y se notificará cuando el mapa esté listo para ser utilizado.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        back.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent i = new Intent(MapasActivity.this, GestionarCoordenada.class);
                startActivity(i);
                finish();
            }
        });
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        //Iniciando Google Play Services
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
                mMap.getUiSettings().setZoomControlsEnabled(true);
            }
        } else {
            buildGoogleApiClient();
            mMap.setMyLocationEnabled(true);
            mMap.getUiSettings().setZoomControlsEnabled(true);
        }
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(1000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setSmallestDisplacement(SMALLEST_DISPLACEMENT);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }


    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
        agregarMarcador();
    }
    private void agregarMarcador() {
        MarkerOptions options = new MarkerOptions();
        IconGenerator iconFactory = new IconGenerator(this);
        iconFactory.setStyle(IconGenerator.STYLE_ORANGE);
        options.icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon(mLastUpdateTime)));
        options.anchor(iconFactory.getAnchorU(), iconFactory.getAnchorV());

        LatLng currentLatLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
        options.position(currentLatLng);
        Marker mapMarker = mMap.addMarker(options);
        long atTime = mCurrentLocation.getTime();
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date(atTime));
        mapMarker.setTitle(mLastUpdateTime);
        Log.d(TAG, "Marcador añadido.............................");
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng,
                17));
        Log.d(TAG, "Zoom hecho.............................");

    }
    @Override
    protected void onPause() {
        super.onPause();
        stopLocationUpdates();
    }

    protected void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(
                mGoogleApiClient, this);
        Log.d(TAG, "Se ha detenido la actualización de la ubicación .......................");
    }


    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;

    public boolean checkLocationPermission() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            // Solicitar al usuario permisos
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.ACCESS_FINE_LOCATION)) {

                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

                //Prompt the user once explanation has been shown
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);


            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);
            }
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_LOCATION: {
                // Si la solicitud se cancela, las matrices de resultados quedan vacías..
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // se concedió permiso.
                    // tarea relacionada con los contactos que necesitas hacer.
                    if (ContextCompat.checkSelfPermission(this,
                            Manifest.permission.ACCESS_FINE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {

                        if (mGoogleApiClient == null) {
                            buildGoogleApiClient();
                        }
                        mMap.setMyLocationEnabled(true);
                    }

                } else {

                    // Permiso denegado, Deshabilitar la funcionalidad que depende de este permiso
                    Toast.makeText(this, "Permiso denegado", Toast.LENGTH_LONG).show();
                }
                return;
            }

            // other 'case' lines to check for other permissions this app might request.
            // You can add here other case statements according to your requirement.
        }

    }
}

Con eso hemos terminado, hay muchas cosas que faltan aclarar pero no podemos alargar este tutorial o se haría aburrido, así que les recomiendo que vallan a nuestro canal de youtube donde se explica mejor este ejercicio, y si quieren llenarse fondo y tal vez hacer mejoras al ejercicio métanse a la documentación de la clase LocationRequest  quien es la culpable de hacer maravilla de este ejercicio, nos vemos y se me cuidan.

Link de la descarga
Programador alfa, lomo plateado, barba de clavos, mentón de roca, no descarga la aplicación sigue el tutorial. Clic para DESCARGAR

     
ENLACES DE INTERÉS:

Como utilizar el vibrador en un celular con android studio

 

Copyright @ 2015 Android-facil.

Designed by Draganus | AndroidFacil