Cómo obtener ubicación mediante AsyncTask

Estoy tirando de mi pelo con tratar de encontrar una buena solución a este problema. Hice mi aplicación para que encuentre mi ubicación. Parece demasiado complicado pero fácil. Sin embargo, siguiendo las recomendaciones de googles ahora estoy tratando de ejecutar este código como una tarea Async por lo que no atar la interfaz de usuario. Sin embargo, ni siquiera puedo averiguar cómo obtener el código para compilar la mente nunca ejecutar. El error es que locationManager no se puede resolver cuando lo referencia para eliminar los oyentes. He intentado usar el código publicado aquí Android encontrar ubicación GPS una vez, mostrar el diálogo de carga . Sin embargo, en este ejemplo, currentLocation no parecía estar referenciado a nada y me encontré con problemas al intentar solucionarlo. He desperdiciado casi un día entero tratando de resolver este problema por lo que realmente apreciaría si alguien puede señalarme en la dirección correcta.

private class LocationControl extends AsyncTask<Context, Void, Location> { public Location alocation; 

locatoinManager local locationManager;

  @Override public Location doInBackground(Context... params) { locationManager = (LocationManager) params[0].getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener); return alocation; } public LocationListener locationListener = new LocationListener() { public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} public void onLocationChanged(android.location.Location mlocation) { saveLocation(mlocation); locationManager.removeUpdates(locationListener); } }; void saveLocation(android.location.Location location){ alocation = location; } @Override protected void onPostExecute(Location result) { useLocation(result); super.onPostExecute(result); } @Override protected void onPreExecute() { dialog.show(WasserSportLotse.this, " ", "Finding location..."); super.onPreExecute(); } } 

Así que cambié el código con sus recomendaciones y ahora compila. He actualizado el código aquí para representar lo que estoy ejecutando. Estoy recibiendo un error de tiempo de ejecución cuando las requestLocationUpdates de locationManager. Aquí está el logCat. ¿Algunas ideas?

 04-15 14:57:56.742: ERROR/AndroidRuntime(18328): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): java.lang.RuntimeException: An error occured while executing doInBackground() 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.AsyncTask$3.done(AsyncTask.java:200) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask.run(FutureTask.java:122) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.lang.Thread.run(Thread.java:1060) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.Handler.<init>(Handler.java:121) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.AsyncTask$2.call(AsyncTask.java:185) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 04-15 14:57:56.942: ERROR/AndroidRuntime(18328): ... 4 more 04-15 14:58:23.451: ERROR/AndroidRuntime(18356): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): java.lang.RuntimeException: An error occured while executing doInBackground() 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.AsyncTask$3.done(AsyncTask.java:200) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask.run(FutureTask.java:122) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.lang.Thread.run(Thread.java:1060) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.Handler.<init>(Handler.java:121) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.AsyncTask$2.call(AsyncTask.java:185) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 04-15 14:58:23.642: ERROR/AndroidRuntime(18356): ... 4 more 

 public class FastMainActivity extends Activity { Button searchBtn = null; Intent locatorService = null; AlertDialog alertDialog = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); searchBtn = (Button) findViewById(R.id.searchBtn); searchBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (!startService()) { CreateAlert("Error!", "Service Cannot be started"); } else { Toast.makeText(FastMainActivity.this, "Service Started", Toast.LENGTH_LONG).show(); } } }); } public boolean stopService() { if (this.locatorService != null) { this.locatorService = null; } return true; } public boolean startService() { try { // this.locatorService= new // Intent(FastMainActivity.this,LocatorService.class); // startService(this.locatorService); FetchCordinates fetchCordinates = new FetchCordinates(); fetchCordinates.execute(); return true; } catch (Exception error) { return false; } } public AlertDialog CreateAlert(String title, String message) { AlertDialog alert = new AlertDialog.Builder(this).create(); alert.setTitle(title); alert.setMessage(message); return alert; } public class FetchCordinates extends AsyncTask<String, Integer, String> { ProgressDialog progDailog = null; public double lati = 0.0; public double longi = 0.0; public LocationManager mLocationManager; public VeggsterLocationListener mVeggsterLocationListener; @Override protected void onPreExecute() { mVeggsterLocationListener = new VeggsterLocationListener(); mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); mLocationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 0, 0, mVeggsterLocationListener); progDailog = new ProgressDialog(FastMainActivity.this); progDailog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { FetchCordinates.this.cancel(true); } }); progDailog.setMessage("Loading..."); progDailog.setIndeterminate(true); progDailog.setCancelable(true); progDailog.show(); } @Override protected void onCancelled(){ System.out.println("Cancelled by user!"); progDialog.dismiss(); mLocationManager.removeUpdates(mVeggsterLocationListener); } @Override protected void onPostExecute(String result) { progDailog.dismiss(); Toast.makeText(FastMainActivity.this, "LATITUDE :" + lati + " LONGITUDE :" + longi, Toast.LENGTH_LONG).show(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub while (this.lati == 0.0) { } return null; } public class VeggsterLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { int lat = (int) location.getLatitude(); // * 1E6); int log = (int) location.getLongitude(); // * 1E6); int acc = (int) (location.getAccuracy()); String info = location.getProvider(); try { // LocatorService.myLatitude=location.getLatitude(); // LocatorService.myLongitude=location.getLongitude(); lati = location.getLatitude(); longi = location.getLongitude(); } catch (Exception e) { // progDailog.dismiss(); // Toast.makeText(getApplicationContext(),"Unable to get Location" // , Toast.LENGTH_LONG).show(); } } @Override public void onProviderDisabled(String provider) { Log.i("OnProviderDisabled", "OnProviderDisabled"); } @Override public void onProviderEnabled(String provider) { Log.i("onProviderEnabled", "onProviderEnabled"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.i("onStatusChanged", "onStatusChanged"); } } } } 

Simplemente agregue Looper.prepare() antes de llamar a locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener); Recuerde llamar Looper.loop () después.

Primero para arreglar el problema de compilación,

 LocationManager locationManager = (LocationManager)params[0].getSystemService(Context.LOCATION_SERVICE); 

De modo que es una variable de miembro privado de la clase.

LocationManager no tiene que estar en una AsyncTask. No ata la interfaz de usuario, todas las actualizaciones ya son asíncronas. Esto solo agregará complicaciones innecesarias a su proyecto.

Es probable que sólo tenga que mover useLocation en onLockationChanged.

 public Location getLocation() { try { locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled Log.w("DOCOMO-2","Network Connection failed"); } else { this.canGetLocation = true; // First get location from Network Provider if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } locationManager=null; location=null; } catch (Exception e) { locationManager=null; location=null; e.printStackTrace(); } return location; } 
  • Cómo obtener la ubicación actual de mi dispositivo
  • Android getLatitude () devuelve latitud geodésica o geocéntrica?
  • ¿Cómo obtener la posición GPS actual sin esperar cambios de ubicación en Android?
  • Android gps proveedor y gps icono
  • Calcule el rumbo de la brújula / rumbo a la ubicación en Android
  • ¿Cómo obtener la ubicación actual de este código de mapa? También intento recibir datos del vehículo del servidor cuando estoy abierto el mapa
  • LocationClient getLastLocation () devolver null
  • Android: ¿Una forma sencilla de hacer una geofence?
  • ¿ICS Android habilita los gps de forma programática?
  • Android: ¿Cómo obtener una altitud exacta?
  • Obtener un total de "Zonas / Zonas" en las que actualmente estoy, basado en la ubicación actual
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.