Android locationManager - событие "местоположение не изменено" - PullRequest
0 голосов
/ 10 декабря 2011

Я создаю сервис, который сообщит мне, если местоположение не изменилось в течение определенного периода времени на определенное количество метров.

Тогда у меня есть событие onLocationChanged намой Слушатель ... но я не знаю, как сделать наоборот ... то есть отправить трансляцию, если местоположение находится в пределах расстояния, которое я указал через несколько минут.

Это код, который у меня есть до сих пор

LocationService

public class LocationService extends Service {

    public static final String LOC_INTENT = "com.xxx.intent.action.LOCATION";

    private Thread triggerService;
    protected LocationManager locationManager;
    protected MyLocationListener MyLocationListener;
    protected Criteria criteria;

    public static final int MIN_TIME = 300000; // 5 Minutes
    public static final long MIN_DISTANCE_MOTOR = 50; // 50 Metres

    private SharedPreferences settings;


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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {

        settings = getSharedPreferences(getString(R.string.settings_prefsName), 0);
        addLocationListener();

        return START_STICKY;
    }

    private void addLocationListener()
    {
        triggerService = new Thread(new Runnable(){
            public void run(){
                try{
                    Looper.prepare();//Initialise the current thread as a looper.
                    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

                    criteria = new Criteria();
                    criteria.setAccuracy(Criteria.ACCURACY_FINE);

                    final String PROVIDER = locationManager.getBestProvider(criteria, true);

                    updateLocation(getLastBestLocation(MIN_TIME, MIN_DISTANCE_MOTOR));

                    MyLocationListener = new MyLocationListener();
                    locationManager.requestLocationUpdates(PROVIDER, MIN_TIME, MIN_DISTANCE_MOTOR, MyLocationListener);
                    Log.d("LOC_SERVICE", "Service RUNNING! ("+PROVIDER+")");
                    Looper.loop();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        }, "LocationThread");
        triggerService.start();
    }


    public Location getLastBestLocation(int minDistance, long minTime) {
        Location bestResult = null;
        float bestAccuracy = Float.MAX_VALUE;
        long bestTime = Long.MIN_VALUE;

        List<String> matchingProviders = locationManager.getAllProviders();
        for (String provider: matchingProviders) {
            Location location = locationManager.getLastKnownLocation(provider);
            if (location != null) {
                float accuracy = location.getAccuracy();
                long time = location.getTime();

                if ((time > minTime && accuracy < bestAccuracy)) {
                    bestResult = location;
                    bestAccuracy = accuracy;
                    bestTime = time;
                }
                else if (time < minTime && bestAccuracy == Float.MAX_VALUE && time > bestTime) {
                    bestResult = location;
                    bestTime = time;
                }
            }
        }

        return bestResult;
    }

    public static void updateLocation(Location location)
    {
        Context appCtx = MyApplication.getAppContext();

        double latitude, longitude;
        float speed;

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        speed = location.getSpeed();

        Intent filterRes = new Intent();
        filterRes.setAction(LOC_INTENT);
        filterRes.putExtra("latitude", latitude);
        filterRes.putExtra("longitude", longitude);
        filterRes.putExtra("speed", speed);
        appCtx.sendBroadcast(filterRes);
    }


    class MyLocationListener implements LocationListener
    {

        @Override
        public void onLocationChanged(Location location)
        {
            if(settings.getBoolean("active", false))
                updateLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

}

1 Ответ

1 голос
/ 10 декабря 2011

Установите таймер так долго, как вы хотите проверить это. Когда он сработает, проверьте, является ли последнее местоположение, которое вы получили в onLocationChanged, больше, чем длина таймера.

EDIT

Вот как я представляю вашу службу, выглядящую

Служба запуска

  • requestLocationUpdates с соответствующим минимальным временем и минимальным расстоянием, о которых вы будете уведомлены после
  • Повторяющаяся задача, в которой вы проверяете, получено ли обновление (см. Timer.scheduleAtFixedRate

Служба запущена

  • Выполните необходимые действия, когда ваш таймер отключается или onLocationChanged называется

Остановка службы

  • Удалить обновления местоположения с помощью removeUpdates
  • Останови таймер
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...