tutorial requestlocationupdates locationservices getlastlocation getfusedlocationproviderclient fusedlocationproviderclient example java android google-maps-android-api-2 android-fusedlocation

java - requestlocationupdates - getfusedlocationproviderclient



Cómo obtener la ubicación actual en GoogleMap usando FusedLocationProviderClient (4)

Quiero recibir actualizaciones periódicas de la ubicación actual (por ejemplo, cada 2 minutos). Sigo la documentación oficial. Escribí este código, pero no ofrece actualizaciones de la ubicación actual cada dos minutos, incluso si el objeto LocationRequest me lo pasa, solicita las solicitudes de actualización. ), aquí está el código:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ private FusedLocationProviderClient FusedLocationClient; private GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } SupportMapFragment map = getSupportFragmentManager().findFragmentById(R.id.map)); map.getMapAsync(this); FusedLocationClient LocationServices.getFusedLocationProviderClient(this); } @Override public void onConnected(Bundle bundle) { FusedLocationClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { if (location != null) { Log.i("MainActivity ", "" + location.getLongitude()) } } }); FusedLocationClient = LocationServices.getFusedLocationProviderClient(this); FusedLocationClient.requestLocationUpdates(requestLocation(), new LocationCallback(){ @Override public void onLocationResult(LocationResult locationResult) { for (Location location : locationResult.getLocations()) { Log.i("MainActivity ", "" + location.getLongitude()); //not getting current location updates every 2 minutes } }; },null); } @Override public void onConnectionSuspended(int i) {} @Override public void onConnectionFailed(ConnectionResult connectionResult) {}


Esto es similar a mi otra respuesta aquí , actualizada para usar la clase FusedLocationProviderClient recientemente introducida.

Para utilizar un FusedLocationProviderClient junto con un mapa de Google:

  1. Espera hasta que el mapa de Google esté listo

  2. Solicite el permiso de ubicación en tiempo de ejecución si es necesario

  3. Solicitar actualizaciones de ubicación una vez que se haya concedido el permiso

  4. Actualizar el mapa de Google una vez que se obtiene la ubicación del usuario

Primero asegúrese de usar al menos la versión 11 de Google Play Services, ya que las versiones anteriores no tienen la clase FusedLocationProviderClient (las versiones más recientes también funcionarán):

dependencies { compile ''com.google.android.gms:play-services-maps:11.6.0'' compile ''com.google.android.gms:play-services-location:11.6.0'' //........ }

Tenga en cuenta que el FusedLocationProviderClient está presente en la versión 11.0.2, pero debido a errores en la implementación inicial, se recomienda que solo use esta clase en 11.6.0 y posteriores. De la documentación:

Nota: se recomienda utilizar los servicios de Google Play versión 11.6.0 o superior, que incluye correcciones de errores para esta clase.

Aquí está la clase de actividad completa:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback { GoogleMap mGoogleMap; SupportMapFragment mapFrag; LocationRequest mLocationRequest; Location mLastLocation; Marker mCurrLocationMarker; FusedLocationProviderClient mFusedLocationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportActionBar().setTitle("Map Location Activity"); mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFrag.getMapAsync(this); } @Override public void onPause() { super.onPause(); //stop location updates when Activity is no longer active if (mFusedLocationClient != null) { mFusedLocationClient.removeLocationUpdates(mLocationCallback); } } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(120000); // two minute interval mLocationRequest.setFastestInterval(120000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { //Location Permission already granted mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); mGoogleMap.setMyLocationEnabled(true); } else { //Request Location Permission checkLocationPermission(); } } else { mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); mGoogleMap.setMyLocationEnabled(true); } } LocationCallback mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { List<Location> locationList = locationResult.getLocations(); if (locationList.size() > 0) { //The last location in the list is the newest Location location = locationList.get(locationList.size() - 1); Log.i("MapsActivity", "Location: " + location.getLatitude() + " " + location.getLongitude()); mLastLocation = location; if (mCurrLocationMarker != null) { mCurrLocationMarker.remove(); } //Place current location marker LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title("Current Position"); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); //move map camera mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 11)); } } }; public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; private void checkLocationPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? 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. new AlertDialog.Builder(this) .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(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION ); } }) .create() .show(); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION ); } } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] 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(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); mGoogleMap.setMyLocationEnabled(true); } } else { // permission denied, boo! Disable the // functionality that depends on this permission. Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); } return; } // other ''case'' lines to check for other // permissions this app might request } } }

Se le solicitará al usuario que acepte el permiso de ubicación:

La ubicación se actualizará en el inicio de la aplicación, y cada dos minutos:


Para hacerlo más sencillo, intente con esta biblioteca https://github.com/mrmans0n/smart-location-lib . Esto utilizará el proveedor de ubicación fusionada.

Usted acaba de poner este código

SmartLocation.with(context).location(new LocationBasedOnActivityProvider(callback)) .start(new OnLocationUpdatedListener() { ... });


private LocationRequest locationRequest; public class MapsActivity extends FragmentActivity implements LocationListener{ locationRequest = new LocationRequest(); locationRequest.setInterval(60 * 1000); locationRequest.setFastestInterval(15 * 1000); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); @Override public void onLocationChanged(Location location) { latitude = location.getLatitude(); longitude = location.getLongitude(); }

Implemente el escucha de cambio de ubicación y podrá anular la ubicación de cambio modificada ...


mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); currentLocation = locationResult.getLastLocation(); } };

este trabajo para mi