AndroidManifest
Contenidos
<?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' }
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.
Hola soy Alex Céspedes fundador de ANDROFAST, programo algunas cosas por diversión, me gusta aprender cosas nuevas y estoy pendiente de todo lo que tenga que ver con tecnología. Este blog lo cree para todas las personas que tengan dificultades en la programación, para ser sincero nunca fui bueno y reprobé algunos cursos de programación, pero mis ganas de aprender pudieron más. SI YO PUEDO TU PUEDES ANIMO!
Muchas gracias 😀
Gracias man
me puede ayudar, lo ejecuto el programa y me sale en blanco el mapa, al igual q los otros cual seria la solucion 🙂
De nada, subscribase a nuestras redes Saludos.
De nada, subscribase a nuestras redes Saludos.
Juan es muy poca la información que nos da, siga el siguiente enlace para pedir ayuda. https://android-morefast.blogspot.pe/2017/02/como-pedir-ayuda.html