Mover marcador con gps en google map android

Quiero hacer mover el marcador en GOOGLE MAP mientras la ubicación de los gps cambia igual que 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 se muestra 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 más comprensión estoy agregando un poco más de código, pero primero quiero decir que estoy usando pestañas en mi aplicación. La primera tab es de mi mapa. Así que estoy usando fragmentos para ello.

 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

8 Solutions collect form web for “Mover marcador con gps en google map android”

Puede utilizar 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. Puede hacerlo mediante el objeto Marcador que se devuelve al agregar Marcador al Mapa. Espero que te ayude.

En primer lugar, implemente LocationListener en su actividad.

Si necesita mostrar sólo un Marcador (posición de actualización del Marcador), utilice:

 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 desea 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 cambió rápidamente, tardaría un par de segundos en que su aplicación actualizara su marcador de ubicación

utilizar esta

Implemente LocationListener ,GoogleMap.OnMyLocationChangeListener en la actividad del mapa

Y luego usar el cambio de ubicación Listener

  @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)); } 

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

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

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

Inorder para animar simplemente llamar a este método ( animateMarker ) con la ubicación anterior y la nueva ubicación junto con el objeto marcador

 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 } 

Espero que esta respuesta te ayudará. En lugar de utilizar gps Google Apused Fused Api leer la documentación aquí para api fusionado y leer esta respuesta Cómo hacer Bus Marker Mover

Intente este enlace tutorial para una mejor comprensión Fused Api Ejemplo

En manifiesto agregue estas líneas

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

Y luego usar 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; } }} 

Si todavía está buscando la solución, espere que esta https://www.youtube.com/watch?v=WKfZsCKSXVQ le ayude. He utilizado esto en una de mis aplicaciones y ayuda a animar el marcador de una ubicación a otra ubicación. El código fuente puede ser agarrado aquí https://gist.github.com/broady/6314689 .

Puede que necesite agregar rotación a su marcador para mostrar la dirección exacta del marcador. El siguiente es el bloque de código que estoy usando para encontrar el rodamiento.

  private float bearingBetweenLatLngs(LatLng begin, LatLng end) { Location beginL = convertLatLngToLocation(begin); Location endL = convertLatLngToLocation(end); return beginL.bearingTo(endL); } 
  • Alerta cuando la ubicación actual está cerca del marcador android map
  • Android Google Maps no se muestra en firmado apk V2
  • Mostrar el botón de direcciones en Google Map cuando se abre la ventana de información mediante programación
  • mMap.setMyLocationEnabled (true); no está mostrando mi botón de ubicación
  • Google Maps no se muestra en el dispositivo Android.
  • Google Maps Android API v2 sólo admite dispositivos con OpenGL ES 2.0 y superior
  • Cómo dibujar las direcciones de carreteras entre dos geocódigos en android google map v2?
  • Android Google Maps V2 cambiar Mi ubicación Icono
  • El método de instantánea de GoogleMap devuelve una imagen blanca
  • Salir de la intención de google maps en android
  • Configuración de un LongClickListener en un marcador de mapa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.