Android тайм-аут GPS

Править: Я переписываю этот вопрос, потому что я, по-видимому, не был ясен.

Иногда сервису GPS на телефоны на базе Android требуется много времени для получения фиксации. Иногда это быстро, иногда требуются часы. Я знаю и принимаю это.

У меня есть приложение, которое делает много вещей. Одна из вещей, которые это должно сделать, позволяют пользователю нажимать кнопку для отправки их текущих координат в сервер. В чем я нуждаюсь, координаты телефона, когда пользователь нажимает кнопку или в течение довольно короткого времени после этого.

Поскольку я знаю, что получение фиксации GPS не мгновенно, и я знаю, что могли потребоваться минуты или часы (во время которого пользователь переместил большое расстояние), я должен кодировать тайм-аут для этой функции. Для этой функции просто не приемлемо загрузить местоположение GPS пользователя три минуты (например) после того, как они нажали кнопку. Хорошо, если требуется 45 секунд, не хорошо, если требуется 75 секунд. Хорошо давать пользователю уведомление об ошибке, если функции не удалось получить местоположение достаточно быстро.

Мне нужна функция, чтобы 'получить местоположение GPS и отправить его на сервер, если не требуется больше чем одной минуты'.

Мой исходный код ниже. Я изменил некоторые вещи начиная с регистрации его. Я добавил Таймер в onStartCommand () метод. Я запускаю TimerTask, что после того, как 60 секунд назовут мою остановку () методом. В начале onLocationChanged () метод, я отменяю TimerTask.

Мой вопрос: действительно ли схема Timer является хорошим способом реализовать этот тайм-аут? Существует ли лучший путь?

Исходный вопрос:

Я пишу приложение Android, которое, среди прочего, должно отправить текущие координаты GPS на сервер, когда пользователь говорит это. Из контекстного меню я выполняю сервис ниже. Служба является LocationListener и запрашивает обновления от LocationManager. Когда это получает местоположение (onLocationChanged ()), это удаляет себя как слушатель и отсылает координаты к серверу. Все это работает.

Однако, если координаты GPS не быстро доступны, мой сервис просто продолжает бежать, пока это не получает некоторых. Это держит UI с диалоговым окном прогресса, которое является раздражающим. Хуже, если пользователь переместился начиная с запуска сервиса, первые координаты GPS могли бы быть неправильными, и приложение отправит неправильные данные на сервер.

Мне нужен тайм-аут на сервисе. Существует ли хороший способ сделать это? Я не очень опытен с потоками. Я думаю, что могу выполнить Выполнимое в onStartCommand () метод, который будет так или иначе считать в обратном порядке 30 секунд и затем, если еще не будет никакого результата GPS, назовите остановку моего сервиса () методом. Это походит на лучший способ сделать это?

С другой стороны, действительно ли возможно сказать, не может ли GPS получить фиксацию? Как я пошел бы о выполнении этого?

Править: Для дальнейшего разъяснения я ищу лучший способ "сдаться" при получении Местоположения после некоторого количества времени.

public class AddCurrentLocation extends Service implements LocationListener {

    Application app;
    LocationManager mLocManager;
    ProgressDialog mDialog;

    @Override
    public int onStartCommand(Intent intent, int arg0, int arg1) {
        app = getApplication();

        // show progress dialog
        if (app.getScreen() != null) {
            mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
        }

        // find GPS service and start listening
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        String bestProvider = mLocManager.getBestProvider(criteria, true);
        mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);

        return START_NOT_STICKY;
    }

    private void stop() {
        mLocManager.removeUpdates(this);
        if (mDialog != null) {
            mDialog.dismiss();
        }
        stopSelf();
    }

    @Override
    public void onLocationChanged(Location location) {
        // done with GPS stop listening
        mLocManager.removeUpdates(this);

        sendLocation(location); // method to send info to server
        stop();
    }

    // other required methods and sendLocation() ...

}
12
задан Scott Saunders 9 June 2010 в 14:25
поделиться

2 ответа

На самом деле это не так. В большинстве ситуаций для определения местоположения по GPS постоянно требуется столько времени. Но с этого момента каждое обновление (каждые 2 секунды в вашем коде) будет текущим положением человека. И первое исправление, которое вы получите, будет текущим положением человека, поэтому данные не будут «устаревшими».

Другое дело. Если вы запускаете этот код в службе, вы не должны блокировать пользовательский интерфейс диалоговым окном выполнения и определенно не из службы. Это ожидаемая утечка памяти. Вы должны показывать прогресс только в том случае, если это может занять максимум 5 секунд и выполняется в потоке Activity. Другой вариант - показать диалоговое окно прогресса в строке заголовка и по-прежнему позволить пользователю взаимодействовать с приложением (вот почему вы все равно используете службу). Отображение прогресса в течение длительного периода времени на самом деле не так удобно для пользователя. Особенно, если они каким-то образом меняют ориентацию (возможно, случайно), а затем ваше приложение вылетает из-за служебного дескриптора диалогового окна, и им приходится начинать заново.

Взгляните на приложение Google I / O 2010 , чтобы увидеть отличный пример того, как действие должно работать со службой. Он использует службу для получения данных и показывает прогресс в заголовке, пока служба выполняет некоторую работу. И по-прежнему позволяет вам делать другие вещи в приложении.

6
ответ дан 2 December 2019 в 21:02
поделиться

Скотт, существует множество факторов, которые влияют на то, сколько времени может занять первое исправление - или даже на то, может ли быть достигнуто исправление, наиболее распространенными из которых являются физические препятствия между устройством и спутниками (например, здания, стены каньона и т. Д.).

Вы не можете контролировать, сколько времени требуется модулю GPS для доставки исправления, но вы можете сказать, как он работает, включая время первого исправления:

locationManager.addGpsStatusListener(gpsListener);

    // this reports on the status of the GPS engine, but does not enable additional controls 
    private static final GpsStatus.Listener gpsListener = new GpsStatus.Listener() {
        public void onGpsStatusChanged(int event) {
            GpsStatus gpsStatus = locationManager.getGpsStatus(null);
            switch (event) {
                case GpsStatus.GPS_EVENT_STARTED: 
                    Log.i(TAG, "onGpsStatusChanged(): GPS started");
                    break;
                case GpsStatus.GPS_EVENT_FIRST_FIX: 
                    Log.i(TAG, "onGpsStatusChanged(): time to first fix in ms = " + gpsStatus.getTimeToFirstFix());
                    break;
                case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
                    // int maxSatellites = gpsStatus.getMaxSatellites();    // appears fixed at 255
                    // if (H.DEBUG) Log.d(TAG, "onGpsStatusChanged(): max sats = " + maxSatellites);
                    if (H.VERBOSE) Log.d(TAG, "onGpsStatusChanged(): ##,used,s/n,az,el");
                    Iterable<GpsSatellite>satellites = gpsStatus.getSatellites();
                    Iterator<GpsSatellite>satI = satellites.iterator();
                    while (satI.hasNext()) {
                        GpsSatellite satellite = satI.next();
                        if (H.VERBOSE) Log.d(TAG, "onGpsStatusChanged(): " + satellite.getPrn() + "," + satellite.usedInFix() + "," + satellite.getSnr() + "," + satellite.getAzimuth() + "," + satellite.getElevation()); 
                        // http://en.wikipedia.org/wiki/Global_Positioning_System: the almanac consists of coarse orbit and status information for each satellite
                        // http://en.wikipedia.org/wiki/Ephemeris: the positions of astronomical objects in the sky at a given time
                        // + "," + satellite.hasAlmanac() + "," + satellite.hasEphemeris());
                    }
                    break;
                case GpsStatus.GPS_EVENT_STOPPED: 
                    Log.i(TAG, "onGpsStatusChanged(): GPS stopped");
                    break;
            }       
        }
    };

События будут генерироваться, когда модуль пытается прослушать доступные спутники. В недавнем тестировании этого с легкими препятствиями я обнаружил, что для получения начального исправления потребовалось 22,4 секунды, в течение которых 24 события SATELLITE_STATUS сообщали о постепенном доступе 8 спутников, прежде чем были получены достаточно чистые сигналы для достижения исправления. Вот последнее событие:

06-08 23: 23: 25.147, D, GPS, 22427, "onGpsStatusChanged (): ##, used, s / n, az, el" 06-08 23: 23: 25.147, D, GPS, 22427, "onGpsStatusChanged (): 2, true, 26.0,57.0,73.0" 06-08 23: 23: 25.147, D, GPS, 22427, "onGpsStatusChanged (): 4, true, 30.0,46.0,27.0" 06-08 23: 23: 25.147, D, GPS, 22427, "onGpsStatusChanged (): 5, true, 19.0,144.0,25.0" 06-08 23: 23: 25.155, D, GPS, 22427, "onGpsStatusChanged (): 9, true, 22.0,202.0,22.0" 06-08 23: 23: 25.155, D, GPS, 22427, "onGpsStatusChanged (): 10, true, 17.0,109.0,32.0" 06-08 23: 23: 25.155, D, GPS, 22427, "onGpsStatusChanged (): 12, true, 32.0,320.0,80.0" 06-08 23: 23: 25.155, D, GPS, 22427, "onGpsStatusChanged (): 29, true, 21.0, 278.0, 21.0" 06-08 23: 23: 25.155, D, GPS, 22427, "onGpsStatusChanged (): 30, true, 31.0,312.0,43.0" 06-08 23: 23: 25.163, D, GpsLocationProvider, 1039, TTFF: 22457 06-08 23:23:25.194, I, GPS, 22427, onGpsStatusChanged (): время до первого исправления в мс = 22457

Обратите внимание, что во время исправления вы получите текущее местоположение, а не то место, где вы когда-то были. Я думаю, что вместе с тем, что у вас уже есть, вы можете добраться туда сейчас. Или посмотрите, как это делают профессионалы здесь .

4
ответ дан 2 December 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: