android android-location

Encontrar la ubicación actual del usuario en Android



android-location (3)

Soy nuevo en Android y estoy tratando de desarrollar una aplicación de Android que muestre la ubicación actual del usuario. Estoy usando Genymotion. Ahora estoy usando

mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient);

para obtener la última ubicación del dispositivo. La cuestión es que quería obtener la ubicación actual, pero con esto obtengo una mlocation que no es nula, está bien. Pero en el mapa muestra la última ubicación del dispositivo, no siempre la ubicación actual.

fragmento de código

@Override public void onConnected(Bundle bundle) { Log.i(TAG, "inside onconnected Location services connected"); Location mLocation=null; mLocationRequest= new LocationRequest(); mLocationRequest.setInterval(10 * 1000) ; mLocationRequest.setFastestInterval(1 * 1000);mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { } mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient); if(mLocation==null) { Log.d("***Inside mlocation***", "***mlocation is null here"); } if (mLocation != null) { onLocationChanged(mLocation); } LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleClient, mLocationRequest, this); } @Override public void onLocationChanged(Location location) { double currentLatitude = location.getLatitude(); double currentLongitude = location.getLongitude(); LatLng latLng = new LatLng(currentLatitude,currentLongitude); MarkerOptions options = new MarkerOptions() .position(latLng) .title("Im here!"); mMap.addMarker(options); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); }

y en onstart() llamé a googleapi.connect() y usé setUpMapIfNeeded() adecuadamente.

Por favor, dime cuál es el problema en este código. Estoy intentando esto por 3 días.


Para el servicio de mapas, requiere los servicios de Google Play. Asegúrese de que su Genymotion tenga PlayService instalado si no, obtenga una ayuda desde Here para instalar Google Play Servies en Genymotion. Feliz codificación .. !!!


publicar una solución simple con código.

agregar permisos dentro del archivo AndroidManifest.xml

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

si su aplicación es compatible con malvaviscos, verifique el permiso de tiempo de ejecución.

agregar dependencia dentro del archivo gradle:

compile ''com.google.android.gms:play-services:9.2.0''

implementa estas dos interfaces en tu actividad

GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener

y

cree un objeto googleapiclient como este en oncreate:

mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build();

y hacer esto en la actividad de inicio

mGoogleApiClient.connect();

aquí vamos al resultado de devolución de llamada de ubicación en este método de anulación.

public void onConnected(@Nullable Bundle bundle) { Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null) { Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude())); } else { Toast.makeText(getApplicationContext(), "Your Location Not Found", Toast.LENGTH_LONG).show(); } }

El código completo de actividad es algo así:

public class LocationActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = LocationActivity.class.getSimpleName(); private GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location); // Create an instance of GoogleAPIClient. if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } } @Override protected void onStart() { // connect googleapiclient mGoogleApiClient.connect(); super.onStart(); } @Override protected void onStop() { // disconnect googleapiclient mGoogleApiClient.disconnect(); super.onStop(); } @Override public void onConnected(@Nullable Bundle bundle) { Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null) { // here we go you can see current lat long. Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude())); } } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { }}

ps googleapiclient no funciona en el emulador sin servicios de reproducción, por lo que debe probarlo en dispositivos reales. asegúrese de que gps esté habilitado en ese dispositivo.

Si desea utilizar el método tradicional para obtener la ubicación, intente este tutorial. http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/

------ ACTUALIZACIÓN 15 DE JUNIO ---------

para ver las últimas apis, consulte la publicación de Android de Google: https://android-developers.googleblog.com/2017/06/reduce-friction-with-new-location-apis.html


LocationListener locationListener; LocationManager locationManager; double latitude; double longitude; locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { longitude = location.getLongitude(); latitude = location.getLatitude(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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. ; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0, locationListener); Log.e("location", longitude + " " + latitude);