varios ubicacion trazar studio ruta obtener marcadores gratis google geolocalizacion example crear app agregar android google-maps android-studio google-maps-api-3 gps

trazar - obtener ubicacion android studio 2017



Mover marcador con gps en google map android (8)

Quiero mover el marcador en GOOGLE MAP mientras la ubicación gps cambia como en la aplicación UBER . He encontrado algunas soluciones, pero no he podido resolver mi problema. Las soluciones son 1 y 2

A continuación está mi método onLocationChange()

public void onLocationChanged(Location location) { double lattitude = location.getLatitude(); double longitude = location.getLongitude(); mLastLocation = location; if (mCurrLocationMarker != null) { mCurrLocationMarker.remove(); } //Place current location marker LatLng latLng = new LatLng(lattitude, longitude); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title("I am here"); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); //move map camera mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); //stop location updates if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } }

Actualización 1 (Reeditado)

Para obtener más información, agrego más código, pero primero quiero decir que estoy usando pestañas en mi aplicación. La primera tab es de mi mapa. Entonces estoy usando fragmentos para eso.

public class MyLocation extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ GoogleMap mGoogleMap; SupportMapFragment mapFrag; LocationRequest mLocationRequest; GoogleApiClient mGoogleApiClient; Location mLastLocation; Marker mCurrLocationMarker=null; TextView tv_loc; private static View view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(view != null) { ViewGroup viewGroupParent = (ViewGroup)view.getParent(); if(viewGroupParent !=null) { viewGroupParent.removeView(viewGroupParent); } } try{ view = inflater.inflate(R.layout.my_location,container, false); }catch (Exception e) { /* map is already there, just return view as it is */ return view; } // inflat and return the layout //View rootView = inflater.inflate(R.layout.my_location, container, false); tv_loc = (TextView)view.findViewById(R.id.textView); mapFrag = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); mapFrag.getMapAsync(this); return view; } @Override public void onPause() { super.onPause(); //stop location updates when Activity is no longer active if(mGoogleApiClient !=null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap=googleMap; mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); //Initialize Google Play Services if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { //Location Permission already granted buildGoogleApiClient(); mGoogleMap.setMyLocationEnabled(true); } else { //Request Location Permission checkLocationPermission(); } } else { buildGoogleApiClient(); mGoogleMap.setMyLocationEnabled(true); } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } @Override public void onConnected(Bundle bundle) { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(1000); mLocationRequest.setFastestInterval(1000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } @Override public void onConnectionSuspended(int i) { } @Override public void onLocationChanged(Location location) { double lattitude = location.getLatitude(); double longitude = location.getLongitude(); //Place current location marker LatLng latLng = new LatLng(lattitude, longitude); if(mCurrLocationMarker!=null){ mCurrLocationMarker.setPosition(latLng); }else{ mCurrLocationMarker = mGoogleMap.addMarker(new MarkerOptions() .position(latLng) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)) .title("I am here")); } tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); //stop location updates if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } /*double lattitude = location.getLatitude(); double longitude = location.getLongitude(); mLastLocation = location; if (mCurrLocationMarker != null) { //mGoogleMap.clear(); mCurrLocationMarker.remove(); } //Place current location marker LatLng latLng = new LatLng(lattitude, longitude); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title("I am here"); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).draggable(true); mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); mCurrLocationMarker.setPosition(new LatLng(lattitude,longitude)); tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); //move map camera mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); //stop location updates if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); }*/ } public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; private void checkLocationPermission() { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), 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. new AlertDialog.Builder(getActivity()) .setTitle("Location Permission Needed") .setMessage("This app needs the Location permission, please accept to use location functionality") .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //Prompt the user once explanation has been shown ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION ); } }) .create() .show(); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION ); } } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { /*super.onRequestPermissionsResult(requestCode, permissions, grantResults);*/ switch (requestCode) { case MY_PERMISSIONS_REQUEST_LOCATION: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // location-related task you need to do. if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if(mGoogleApiClient == null) { buildGoogleApiClient(); } mGoogleMap.setMyLocationEnabled(true); } } else { // permission denied, boo! Disable the // functionality that depends on this permission. //finish(); Toast.makeText(getActivity(), "permission denied", Toast.LENGTH_LONG).show(); } return; } // other ''case'' lines to check for other // permissions this app might request } } @Override public void onResume() { super.onResume(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { }}

Cualquier ayuda sería muy apreciada


En manifiesto agrega estas líneas

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

y luego usa esta clase

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { GoogleMap mgoogleMap; GoogleApiClient mgoogleApi; Context context; Marker marker; LocationRequest locationrequest; public static final int map=1111; public static final int coarse=1112; @Override protected void onCreate(Bundle savedInstanceState) { if (googleServiceAvalable()) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = getApplicationContext(); checkReadPermission(); checkCoarsePermission(); initMap(); } else { } } public boolean googleServiceAvalable() { GoogleApiAvailability api = GoogleApiAvailability.getInstance(); int isavailable = api.isGooglePlayServicesAvailable(this); if (isavailable == ConnectionResult.SUCCESS) { return true; } else if (api.isUserResolvableError(isavailable)) { Dialog dialog = api.getErrorDialog(this, isavailable, 0); dialog.show(); } else { Toast.makeText(this, "cant connect to play services", Toast.LENGTH_LONG).show(); } return false; } private void initMap() { MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.fragment); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mgoogleMap = googleMap; if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } } mgoogleMap.setMyLocationEnabled(true); if(checkCoarsePermission() && checkReadPermission()){ mgoogleApi = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); mgoogleApi.connect(); }else { checkReadPermission(); checkCoarsePermission(); } } private void goToLocation(double latitude, double longitude, int i) { LatLng ll = new LatLng(latitude, longitude); CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, i); mgoogleMap.animateCamera(update); if(marker !=null){ marker.remove(); } MarkerOptions options =new MarkerOptions() .title("Test") .draggable(true) .position(new LatLng(latitude,longitude )); marker= mgoogleMap.addMarker(options); } @Override public void onConnected(@Nullable Bundle bundle) { locationrequest = new LocationRequest().create(); locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationrequest.setInterval(1000); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } LocationServices.FusedLocationApi.requestLocationUpdates(mgoogleApi, locationrequest, this); Toast.makeText(context,"Location Connected and ready to publish",Toast.LENGTH_SHORT).show(); } @Override public void onConnectionSuspended(int i) { Toast.makeText(context,"Location Connection Suspended",Toast.LENGTH_SHORT); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(context,"Location Connection Failed"+connectionResult.getErrorMessage(),Toast.LENGTH_SHORT); } @Override public void onLocationChanged(Location location) { if(location==null){ Toast.makeText(context,"Cant Find User Location",Toast.LENGTH_SHORT); }else { LatLng ll=new LatLng(location.getLatitude(),location.getLongitude()); goToLocation(ll.latitude,ll.longitude,18); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public boolean checkReadPermission() { int currentAPIVersion = Build.VERSION.SDK_INT; if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this); alertBuilder.setCancelable(true); alertBuilder.setTitle("Permission necessary"); alertBuilder.setMessage("Read Internal Storage permission required to display images!!!"); alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, map); } }); AlertDialog alert = alertBuilder.create(); alert.show(); } else { ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, map); } return false; } else { return true; } } else { return true; } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public boolean checkCoarsePermission() { int currentAPIVersion = Build.VERSION.SDK_INT; if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) MainActivity.this, android.Manifest.permission.ACCESS_COARSE_LOCATION)) { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this); alertBuilder.setCancelable(true); alertBuilder.setTitle("Permission necessary"); alertBuilder.setMessage("Read Internal Storage permission required to display images!!!"); alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, coarse); } }); AlertDialog alert = alertBuilder.create(); alert.show(); } else { ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, coarse); } return false; } else { return true; } } else { return true; } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case map: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { Toast.makeText(context,"You have to give permission",Toast.LENGTH_SHORT).show(); } break; case coarse: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { Toast.makeText(context,"You have to give permission",Toast.LENGTH_SHORT).show(); } break; } }}


En primer lugar, implemente LocationListener en su Actividad, luego

si necesita mostrar solo un marcador (posición de actualización de Marker), use esto:

private Marker currentPositionMarker = null; @Override public void onLocationChanged(Location location) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); CameraPosition cameraPosition = new CameraPosition.Builder() .target(latLng).zoom(14).build(); // mMap.clear(); // Call if You need To Clear Map if (currentPositionMarker == null) currentPositionMarker = mMap.addMarker(new MarkerOptions() .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)) .position(latLng) .zIndex(20)); else currentPositionMarker.setPosition(latLng); mMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); }

o si quieres agregar un nuevo marcador cada vez:

@Override public void onLocationChanged(Location location) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); CameraPosition cameraPosition = new CameraPosition.Builder() .target(latLng).zoom(14).build(); mMap.addMarker(new MarkerOptions() .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)) .position(latLng) .zIndex(20)); mMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); }

si la ubicación se cambió rápidamente, su aplicación tardaría unos segundos en actualizar su marcador de ubicación



Esto se puede hacer usando CameraPosition, googleMap.animateCamera y la animación del movimiento del marcador usando un interpolador lineal.

Puedes echar un vistazo a este tutorial aquí y a la página correspondiente de github.

Este tutorial usa google maps v2. Espero que esto ayude.


Para animar simplemente llame a este método ( animateMarker ) con la ubicación anterior y la nueva ubicación junto con el objeto Marker

private Marker mCurrentMarker; private float ZOOMLEVEL=18.0f; private LatLng previousLatLon; private Handler mLocalHandler; private GoogleMap mGoogleMap; public void animateMarker(final Marker marker, final LatLng toPosition,final LatLng fromPosition) { final long duration = 500; final Interpolator interpolator = new LinearInterpolator(); mLocalHandler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - mStartTime; float t = interpolator.getInterpolation((float) elapsed / duration); marker.setPosition(toPosition); marker.setAnchor(Constants.MAPANCHOR, Constants.MAPANCHOR); mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(toPosition, ZOOMLEVEL)); if (t < 1.0) { // Post again 16ms later. mLocalHandler.postDelayed(this, 16); } else { marker.setVisible(true); } } } }); previousLatLon=toPosition;// reassign the previous location to current location }


Puede usar el código a continuación para actualizar la posición del marcador

public void onLocationChanged(Location location) { double lattitude = location.getLatitude(); double longitude = location.getLongitude(); //Place current location marker LatLng latLng = new LatLng(lattitude, longitude); if(mCurrLocationMarker!=null){ mCurrLocationMarker.setPosition(latLng); }else{ mCurrLocationMarker = mGoogleMap.addMarker(new MarkerOptions() .position(latLng) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)) .title("I am here"); } tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); gMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); //stop location updates if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } }

No es necesario borrar el mapa cada vez. Puedes hacerlo mediante el objeto Marker que se devuelve al agregar Marker a Map. Espero que te ayude.


Si aún está buscando la solución, espero que esto https://www.youtube.com/watch?v=WKfZsCKSXVQ lo ayude. Lo he usado en una de mis aplicaciones y me ayuda a animar el marcador desde una ubicación a otra. El código fuente puede ser agarrado aquí https://gist.github.com/broady/6314689 .

Es posible que necesite agregar rotación a su marcador para mostrar la dirección exacta del marcador. A continuación está el bloque de código que estoy usando para encontrar rumbo.

private float bearingBetweenLatLngs(LatLng begin, LatLng end) { Location beginL = convertLatLngToLocation(begin); Location endL = convertLatLngToLocation(end); return beginL.bearingTo(endL); }


utilizar esta

implementar LocationListener ,GoogleMap.OnMyLocationChangeListener en su actividad de mapa

y luego usar el oyente de cambio de ubicación

@Override public void onMyLocationChange(Location location) { //mMap.clear //if you want refresh map remove comand // Getting latitude of the current location double latitude = location.getLatitude(); // Getting longitude of the current location double longitude =location.getLongitude(); // Creating a LatLng object for the current location LatLng latLng = new LatLng(latitude, longitude); //your_text_view.settext(latitude+","+longtitudde) // Showing the current location in Google Map mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.destination_marker)).position(latLng).title(maping_status)); // Zoom in the Google Map mMap.animateCamera(CameraUpdateFactory.zoomTo(20)); }