Obteniendo latitud y longitud utilizando gps cada 10 minutos en segundo plano android

He terminado de obtener latitud y longitud utilizando LocationManager y trabajando correctamente.

Requisito:

Obtener la latitud y la longitud cada 10 minutos si la aplicación está cerca o no.

Estoy tratando de servicios, hilo, AlarmManager, etc

Mi aplicación es el trabajo bueno por 1-2 horas después después de automáticamente no consigue la latitud y la longitud pero mis servicios todavía está funcionando.

Si alguien sabe entonces, por favor, me dan la línea de guía de cómo buscar la latitud y la longitud cada 10 minutos en el fondo.

LocationActivity.java

Cuando el usuario haga clic en el botón Inicio.

 Intent i=new Intent(context, OnAlarmReceiver.class); PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+60000,PERIOD,pi); 

OnAlarmReceiver.java

Soy comenzar mis servicios.

 public class OnAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.startService(new Intent(context, MyService.class)); } } 

MyService.java

 @Override public void onStart(Intent intent, int startId) { // super.onStart(intent, startId); new MyTime(mContext); } 

MyTime.java

Obteniendo latitud y longitud.

Su ubicación realmente no se guardará en la base de datos porque cada vez que su ubicación se actualiza (via onLocationChanged(Location location))

Lo que debe hacer es llevar la inicialización del timer en su método OnCreate() . Entonces declarar estas variables.

 double lat = location.getLatitude(); double lng = location.getLongitude(); double alt = location.getAltitude(); 

Como global y tenerlos actualizados en el onLocationChanged(Location location) . De esta forma, cada vez que el temporizador pida persistencia en su base de datos, los valores lat, lng, alt estarán disponibles y actualizados en función de su ubicación más reciente.

 //decalred as global variables String curTime; double lat; double lng; double alt; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LocationManager locationManager; String context = Context.LOCATION_SERVICE; locationManager = (LocationManager)getSystemService(context); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = locationManager.getBestProvider(criteria, true); //Initialize timer Timer timer = new Timer(); timer.schedule(new TimerTask(){ @Override public void run(){ db.execSQL("INSERT INTO location (longitude,latitude,altitude,tgl_buat) VALUES " + "('"+lng+"','"+lat+"','"+alt+"','"+curTime+"')"); db.close(); } }, 10*60*1000, 10*60*1000); updateWithNewLocation(null); locationManager.requestLocationUpdates(provider, (10*60*1000), 10, locationListener); } private final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location); } public void onProviderDisabled(String provider){ updateWithNewLocation(null); } public void onProviderEnabled(String provider){ } public void onStatusChanged(String provider, int status, Bundle extras){ } }; public void updateWithNewLocation(Location location) { if (location != null) { Dbhelper helper = new Dbhelper(this); final SQLiteDatabase db = helper.getWritableDatabase(); long time = System.currentTimeMillis(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss"); curTime = df.format(time); lat = location.getLatitude(); lng = location.getLongitude(); alt = location.getAltitude(); System.out.println(lat); System.out.println(lng); System.out.println(alt); } } 

AÑADIDO: – y si dibujas un camino entonces usas un Este código

 /** Called when the activity is first created. */ private List<Overlay> mapOverlays; private Projection projection; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); linearLayout = (LinearLayout) findViewById(R.id.zoomview); mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); mapOverlays = mapView.getOverlays(); projection = mapView.getProjection(); mapOverlays.add(new MyOverlay()); } @Override protected boolean isRouteDisplayed() { return false; } class MyOverlay extends Overlay{ public MyOverlay(){ } public void draw(Canvas canvas, MapView mapv, boolean shadow){ super.draw(canvas, mapv, shadow); Paint mPaint = new Paint(); mPaint.setDither(true); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(2); GeoPoint gP1 = new GeoPoint(19240000,-99120000); GeoPoint gP2 = new GeoPoint(37423157, -122085008); Point p1 = new Point(); Point p2 = new Point(); Path path = new Path(); projection.toPixels(gP1, p1); projection.toPixels(gP2, p2); path.moveTo(p2.x, p2.y); path.lineTo(p1.x,p1.y); canvas.drawPath(path, mPaint); } 

Prueba de esta manera,

En lugar de esta línea

 alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+60000,PERIOD,pi); 

Prueba mi lógica,

 alarmManager.set(AlarmManager.RTC_WAKEUP, 60 * 1000, pi); 

También puede ver un muy buen ejemplo de AlarmManager .

No veo ningún comando de finalización de servicio, mientras que usted está tratando de obtener la posición sólo en el comando de inicio.

En general, es un problema bastante complejo: el período de 10 minutos sugiere el uso de AlarmManager – está bien, pero … Conseguir posición a veces dura mucho más de 10 minutos. El receptor del GPS consume la cantidad extraordinaria de batería cuando intenta conseguir la posición fija, así que hay posibilidad, eso en algunas condiciones que cambia el GPS encendido / apagado periódicamente consumirá más batería que dejándola encendida. Considere algunos "compresión loosy" – combinar diferentes proveedores de ubicación para llamar a GPS sólo cuando realmente se necesita (es decir, el tiempo, la ubicación gruesa cambiado, etc)

Estoy usando esta manera y resolver mi problema.

 PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), PERIOD , pi); 

No sé si esto es correcto o incorrecto. Pero trabaje para mí. Gracias @ Lucifer, @ Maya mAku y @piotrpo para su guidline.

 Try By this one : private void doSomethingRepeatedly() { timer.scheduleAtFixedRate( new TimerTask() { public void run() { try{ //Do your work here } catch (Exception e) { // TODO: handle exception } } }, 0, 10000); } 
  • Error de constructores no predeterminados en fragmentos
  • Obtener Lat Lang de un place_id devuelto por autocompletar lugar api
  • Android google maps, google lugares, latitud norte supera el sur latitiude
  • Cómo obtener el siguiente punto de inflexión desde el mapa de google - (Android)
  • Google Maps no se muestra después de publicar la aplicación android?
  • Contexto nulo Puntero
  • ¿Cómo funciona la verificación de claves API de Google Maps para Android v2?
  • Cómo agregar su aplicación a la lista "compartir este lugar" en Google maps
  • MoveCamera y animateCamera no funcionan la segunda vez
  • android.view.inflateexception binario archivo xml línea # 6 error o inflar fragmento de clase
  • Android- mapa de Google v2 dibujar círculo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.