Как собирать данные о местоположении каждые 10 секунд в Android

1

Я написал GPSDataCollectService для сбора данных о местоположении каждые 10 секунд, но он не сообщил о местоположении на моем мобильном телефоне HTC, не так ли? может кто-нибудь мне помочь?

package com.android.example;

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

public class GPSDataCollectorService extends Service {

    private static final String TAG = GPSDataCollectorService.class
            .getSimpleName();

    LocationManager locationManager;
    LocationListener gpsLocationListener;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private Timer timer;

    private TimerTask collectTask = new TimerTask() {
        @Override
        public void run() {
            Log.i(TAG, "Timer task doing work: "
                    + Calendar.getInstance().getTimeInMillis());
            locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);
            gpsLocationListener = new GPSLocationListener();
            locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 10 * 1000L, 0,
                    gpsLocationListener);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Service creating");
        timer = new Timer("GPSDataCollectorTimer");
        timer.schedule(collectTask, 1000L, 10 * 1000L);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "Service destroying");
        locationManager.removeUpdates(gpsLocationListener);
        timer.cancel();
        timer = null;
    }

    private class GPSLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged: " + location.toString());
            locationManager.removeUpdates(gpsLocationListener);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged: " + status);
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

    }

}
Теги:

2 ответа

0

Вместо использования LocationListener вы можете использовать таймер в TimerTask, возможно, вы можете сделать что-то вроде этого:

LocationManager lm = yourActivityReference.getSystemService(Context.LOCATION_SERVICE);
String provider = lm.getBestProvider(new Criteria(),true);
Location loc = lm.getLastKnownLocation (provider);

Я не проверял его, но если я это сделаю, я дам знать...

С уважением.

EDIt: Позвольте мне попробовать еще раз с "классическим" подходом.

public class GPSDataCollectorService extends Service {

    private static final String TAG = GPSDataCollectorService.class
            .getSimpleName();

    LocationManager locationManager;
    LocationListener gpsLocationListener;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        gpsLocationListener = new GPSLocationListener();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000L, 0, gpsLocationListener);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "Service destroying");
        locationManager.removeUpdates(gpsLocationListener);
    }

    private class GPSLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged: " + location.toString());
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged: " + status);
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

    }

}

Я не думаю, что вам нужен Timer, так как обновления местоположения будут вызывать ваш слушатель асинхронно, и вы можете установить таймаут. Я не очень много играл с GPS в Android, но там должно быть много примеров.

  • 0
    если не вызывать метод requestLocationUpdates для locationManager, как вызвать Android для запуска GPS_Provider? при первом вызове getLastKnownLocation (GPS_Provider) возвращаемое местоположение является нулевым.
  • 0
    ну, возможно, вам следует также вызвать requestLocationUpdates. Я не тестировал свой кусок кода, но подожди, теперь, когда я уделяю больше внимания твоему коду ... Я не думаю, что это правильный подход.
0

Если ваше местоположение изменяется каждые 10 секунд, тогда только ваш LocationManager будет отслеживать новое местоположение. В противном случае он будет использовать то же последнее известное местоположение.

  • 0
    не могли бы вы показать мне код? Спасибо!
  • 0
    мое местоположение постоянно меняется, но я хочу открывать GPS каждые 10 секунд, чтобы запрашивать данные о местоположении, и закрывать GPS после получения данных о местоположении, учитывая заряд батареи и использование затрат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню