Respuestas:
Usa el LocationManager
.
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double longitude = location.getLongitude();
double latitude = location.getLatitude();
La llamada a getLastKnownLocation()
no bloquea - lo que significa que volverá null
si no hay posición disponible - por lo que es probable que desee echar un vistazo a un paso LocationListener
del requestLocationUpdates()
método en su lugar, lo que le dará actualizaciones asíncronas de su ubicación.
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
longitude = location.getLongitude();
latitude = location.getLatitude();
}
}
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
Tendrá que dar ACCESS_FINE_LOCATION
permiso a su aplicación si desea utilizar el GPS.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
También es posible que desee agregar el ACCESS_COARSE_LOCATION
permiso para cuando el GPS no esté disponible y seleccione su proveedor de ubicación con el getBestProvider()
método .
Aquí está la clase LocationFinder
para encontrar la ubicación del GPS. Esta clase llamará MyLocation
, lo que hará el negocio.
LocationFinder
public class LocationFinder extends Activity {
int increment = 4;
MyLocation myLocation = new MyLocation();
// private ProgressDialog dialog;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intermediat);
myLocation.getLocation(getApplicationContext(), locationResult);
boolean r = myLocation.getLocation(getApplicationContext(),
locationResult);
startActivity(new Intent(LocationFinder.this,
// Nearbyhotelfinder.class));
GPSMyListView.class));
finish();
}
public LocationResult locationResult = new LocationResult() {
@Override
public void gotLocation(Location location) {
// TODO Auto-generated method stub
double Longitude = location.getLongitude();
double Latitude = location.getLatitude();
Toast.makeText(getApplicationContext(), "Got Location",
Toast.LENGTH_LONG).show();
try {
SharedPreferences locationpref = getApplication()
.getSharedPreferences("location", MODE_WORLD_READABLE);
SharedPreferences.Editor prefsEditor = locationpref.edit();
prefsEditor.putString("Longitude", Longitude + "");
prefsEditor.putString("Latitude", Latitude + "");
prefsEditor.commit();
System.out.println("SHARE PREFERENCE ME PUT KAR DIYA.");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
// handler for the background updating
}
Mi ubicacion
public class MyLocation {
Timer timer1;
LocationManager lm;
LocationResult locationResult;
boolean gps_enabled=false;
boolean network_enabled=false;
public boolean getLocation(Context context, LocationResult result)
{
//I use LocationResult callback class to pass location value from MyLocation to user code.
locationResult=result;
if(lm==null)
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//exceptions will be thrown if provider is not permitted.
try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}
//Toast.makeText(context, gps_enabled+" "+network_enabled, Toast.LENGTH_LONG).show();
//don't start listeners if no provider is enabled
if(!gps_enabled && !network_enabled)
return false;
if(gps_enabled)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
if(network_enabled)
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
timer1=new Timer();
timer1.schedule(new GetLastLocation(), 10000);
// Toast.makeText(context, " Yaha Tak AAya", Toast.LENGTH_LONG).show();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
timer1.cancel();
locationResult.gotLocation(location);
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location) {
timer1.cancel();
locationResult.gotLocation(location);
lm.removeUpdates(this);
lm.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
class GetLastLocation extends TimerTask {
@Override
public void run() {
//Context context = getClass().getgetApplicationContext();
Location net_loc=null, gps_loc=null;
if(gps_enabled)
gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(network_enabled)
net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//if there are both values use the latest one
if(gps_loc!=null && net_loc!=null){
if(gps_loc.getTime()>net_loc.getTime())
locationResult.gotLocation(gps_loc);
else
locationResult.gotLocation(net_loc);
return;
}
if(gps_loc!=null){
locationResult.gotLocation(gps_loc);
return;
}
if(net_loc!=null){
locationResult.gotLocation(net_loc);
return;
}
locationResult.gotLocation(null);
}
}
public static abstract class LocationResult{
public abstract void gotLocation(Location location);
}
}
Con las google
cosas cambia muy a menudo: ninguna de las respuestas anteriores me funcionó.
basado en esta capacitación de Google aquí es cómo lo haces usando
proveedor de ubicación fusionada
esto requiere configurar los servicios de Google Play
Clase de actividad
public class GPSTrackerActivity extends AppCompatActivity implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
Location mLastLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
}
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onConnected(Bundle bundle) {
try {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
Intent intent = new Intent();
intent.putExtra("Longitude", mLastLocation.getLongitude());
intent.putExtra("Latitude", mLastLocation.getLatitude());
setResult(1,intent);
finish();
}
} catch (SecurityException e) {
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
}
uso
en tu actividad
Intent intent = new Intent(context, GPSTrackerActivity.class);
startActivityForResult(intent,1);
Y este metodo
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1){
Bundle extras = data.getExtras();
Double longitude = extras.getDouble("Longitude");
Double latitude = extras.getDouble("Latitude");
}
}
puedes obtener el latn actual usando esto
``
public class MainActivity extends ActionBarActivity {
private LocationManager locationManager;
private String provider;
private MyLocationListener mylistener;
private Criteria criteria;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the location provider
criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE); //default
// user defines the criteria
criteria.setCostAllowed(false);
// get the best provider depending on the criteria
provider = locationManager.getBestProvider(criteria, false);
// the last known location of this provider
Location location = locationManager.getLastKnownLocation(provider);
mylistener = new MyLocationListener();
if (location != null) {
mylistener.onLocationChanged(location);
} else {
// leads to the settings because there is no last known location
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
// location updates: at least 1 meter and 200millsecs change
locationManager.requestLocationUpdates(provider, 200, 1, mylistener);
String a=""+location.getLatitude();
Toast.makeText(getApplicationContext(), a, 222).show();
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
// Initialize the location fields
Toast.makeText(MainActivity.this, ""+location.getLatitude()+location.getLongitude(),
Toast.LENGTH_SHORT).show()
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Toast.makeText(MainActivity.this, provider + "'s status changed to "+status +"!",
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(MainActivity.this, "Provider " + provider + " enabled!",
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(MainActivity.this, "Provider " + provider + " disabled!",
Toast.LENGTH_SHORT).show();
}
}
``
Las soluciones anteriores también son correctas, pero en algún momento si la ubicación es nula, se bloquea la aplicación o no funciona correctamente. La mejor manera de obtener Latitud y Longitud de Android es:
Geocoder geocoder;
String bestProvider;
List<Address> user = null;
double lat;
double lng;
LocationManager lm = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
bestProvider = lm.getBestProvider(criteria, false);
Location location = lm.getLastKnownLocation(bestProvider);
if (location == null){
Toast.makeText(activity,"Location Not found",Toast.LENGTH_LONG).show();
}else{
geocoder = new Geocoder(activity);
try {
user = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
lat=(double)user.get(0).getLatitude();
lng=(double)user.get(0).getLongitude();
System.out.println(" DDD lat: " +lat+", longitude: "+lng);
}catch (Exception e) {
e.printStackTrace();
}
}
La mejor manera es
Agregar archivo de manifiesto de permiso
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Luego puede obtener la ubicación GPS o si la ubicación GPS no está disponible, entonces esta función devuelve la ubicación de RED
public static Location getLocationWithCheckNetworkAndGPS(Context mContext) {
LocationManager lm = (LocationManager)
mContext.getSystemService(Context.LOCATION_SERVICE);
assert lm != null;
isGpsEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkLocationEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Location networkLoacation = null, gpsLocation = null, finalLoc = null;
if (isGpsEnabled)
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return null;
}gpsLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (isNetworkLocationEnabled)
networkLoacation = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (gpsLocation != null && networkLoacation != null) {
//smaller the number more accurate result will
if (gpsLocation.getAccuracy() > networkLoacation.getAccuracy())
return finalLoc = networkLoacation;
else
return finalLoc = gpsLocation;
} else {
if (gpsLocation != null) {
return finalLoc = gpsLocation;
} else if (networkLoacation != null) {
return finalLoc = networkLoacation;
}
}
return finalLoc;
}
Esta es una vieja pregunta y la mayoría de las respuestas están desactualizadas. Así es como lo hago ahora con mis aplicaciones:
Esta clase ayuda a rastrear la ubicación del dispositivo y devolver la lista de direcciones del dispositivo usando Geocoding. Ponlo en alguna clase util
import android.Manifest
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.*
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import androidx.core.app.ActivityCompat
import com.bmw.weatherapp.R
import kotlinx.coroutines.*
import java.io.IOException
import java.lang.ref.WeakReference
import java.util.*
import kotlin.coroutines.CoroutineContext
/**
* Use GPS or Network Provider to get Device Location
*/
class DeviceLocationTracker(context: Context, deviceLocationListener: DeviceLocationListener) : LocationListener, CoroutineScope {
private var deviceLocation: Location? = null
private val context: WeakReference<Context>
private var locationManager: LocationManager? = null
private var deviceLocationListener: DeviceLocationListener
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
init {
this.context = WeakReference(context)
this.deviceLocationListener = deviceLocationListener
initializeLocationProviders()
}
private fun initializeLocationProviders() {
//Init Location Manger if not already initialized
if (null == locationManager) {
locationManager = context.get()
?.getSystemService(Context.LOCATION_SERVICE) as LocationManager
}
locationManager?.apply {
// flag for GPS status
val isGPSEnabled = isProviderEnabled(LocationManager.GPS_PROVIDER)
// flag for network status
val isNetworkEnabled = isProviderEnabled(LocationManager.PASSIVE_PROVIDER)
//If we have permission
if (ActivityCompat.checkSelfPermission(context.get()!!, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(context.get()!!, Manifest.permission.ACCESS_COARSE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//First Try GPS
if (isGPSEnabled) {
requestLocationUpdates(
LocationManager.GPS_PROVIDER,
UPDATE_FREQUENCY_TIME,
UPDATE_FREQUENCY_DISTANCE.toFloat(), this@DeviceLocationTracker)
deviceLocation = locationManager!!.getLastKnownLocation(LocationManager.GPS_PROVIDER)
} else {
// Show alert to open GPS
context.get()?.apply {
AlertDialog.Builder(this)
.setTitle(getString(R.string.title_enable_gps))
.setMessage(getString(R.string.desc_enable_gps))
.setPositiveButton(getString(R.string.btn_settings)
) { dialog, which ->
val intent = Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(intent)
}.setNegativeButton(getString(R.string.btn_cancel))
{ dialog, which -> dialog.cancel() }.show()
}
}
//If failed try using NetworkManger
if(null==deviceLocation && isNetworkEnabled) {
requestLocationUpdates(
LocationManager.PASSIVE_PROVIDER,
0, 0f,
this@DeviceLocationTracker)
deviceLocation = locationManager!!.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
}
}
}
}
/**
* Stop using GPS listener
* Must call this function to stop using GPS
*/
fun stopUpdate() {
if (locationManager != null) {
locationManager!!.removeUpdates(this@DeviceLocationTracker)
}
}
override fun onLocationChanged(newDeviceLocation: Location) {
deviceLocation = newDeviceLocation
launch(Dispatchers.Main) {
withContext(Dispatchers.IO) {
var addressList: List<Address?>? = null
try {
addressList = Geocoder(context.get(),
Locale.ENGLISH).getFromLocation(
newDeviceLocation.latitude,
newDeviceLocation.longitude,
1)
deviceLocationListener.onDeviceLocationChanged(addressList)
Log.i(TAG, "Fetch address list"+addressList)
} catch (e: IOException) {
Log.e(TAG, "Failed Fetched Address List")
}
}
}
}
override fun onProviderDisabled(provider: String) {}
override fun onProviderEnabled(provider: String) {}
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
interface DeviceLocationListener {
fun onDeviceLocationChanged(results: List<Address>?)
}
companion object {
// The minimum distance to change Updates in meters
private const val UPDATE_FREQUENCY_DISTANCE: Long = 1 // 10 meters
// The minimum time between updates in milliseconds
private const val UPDATE_FREQUENCY_TIME: Long = 1 // 1 minute
private val TAG = DeviceLocationTracker::class.java.simpleName
}
}
Agregue cadenas para el diálogo de alerta en caso de que el GPS esté deshabilitado
<string name="title_enable_gps">Enable GPS</string>
<string name="desc_enable_gps">GPS is not enabled. Do you want to go to settings menu?</string>
<string name="btn_settings">Open Settings</string>
<string name="btn_cancel">Cancel</string>
Agregue estos permisos en su manifiesto de Android y solicítelos en el inicio de la aplicación
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Uso
Implementar DeviceLocationListener
en tu Activity/Fragment
clase
class MainActivity : AppCompatActivity, DeviceLocationTracker.DeviceLocationListener {
Anular onDeviceLocationChanged
devolución de llamada. Obtendrá la ubicación actual enonDeviceLocationChanged
override fun onDeviceLocationChanged(results: List<Address>?) {
val currntLocation = results?.get(0);
currntLocation?.apply {
currentlLat = latitude
currentLng = longitude
Country = countryCode
cityName = getAddressLine(0)
}
}
Para iniciar el seguimiento, cree un DeviceLocationTracker
objeto en el onCreate
método de su. Pase el Activity
contexto y esto como DeviceLocationListener
.
private lateinit var deviceLocationTracker: DeviceLocationTracker
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
deviceLocationTracker= DeviceLocationTracker(this, this)
Eso es todo, ahora comenzarás a recibir actualizaciones de ubicación onDeviceLocationChanged
.