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