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:
- Android: ¿La API de Google Maps sigue siendo gratuita?
- Renderizar elementos del clúster al hacer clic en el clúster
- Cómo obtener lat y largo en evento de toque de google map?
- Animación de marcadores en Google Maps V2
- Prefijo de espacio de nombres inesperado "xmlns" encontrado para fragmento de etiqueta Prefijo de espacio de nombres inesperado "mapa" encontrado para fragmento de etiqueta
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.
- Android mapa api-2 deshabilitar haga clic
- Cómo obtener coordenadas de una dirección en android
- Utilice google map en cualquier dispositivo. (Sin jugar de google)
- Controles de zoom que no se muestran cuando se utiliza MapView con fill_parent
- La API de Google Maps para Android no funciona con debug.keystore
- Cómo mostrar lugares cercanos como atm, hospitales en android google map?
- API de Google Maps, ¿debo comprar?
- Android agrega a las ubicaciones de los usuarios (Google maps)
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); }
- Public onCreate (), o onCreate protegido ()?
- Terminar una llamada telefónica con un comando de voz para ayudar a una persona que está paralizada