Подтвердить что ты не робот

Проблема определения местоположения GPS в Android

Я работаю над приложениями для отслеживания gps в Android. Вот моя архитектура кода:

  1. BackgroundSyncService: класс службы, который используется для получения обновления местоположения. Здесь GoogleApiClient инициализируется и реализует другие методы, связанные с местоположением.
  2. AppRunCheckerReceiver: класс BroadcastReceiver, который проверяет, работает ли мой BackgroundSyncService или нет в промежутке времени. Если он остановится, начнется.
  3. GpsEnableReceiver: BroadcastReceiver будет срабатывать, если статус gps изменился. Он проверит, работает ли мой BackgroundSyncService или нет в промежутке времени. Если он остановится, начнется.
  4. InternetConnectionStateReceiver: BroadcastReceiver будет срабатывать при изменении статуса Интернета. Он проверит, работает ли мой BackgroundSyncService или нет в промежутке времени. Если он остановлен, он начнется.

В моей службе BackgroundSyncService я инициализирую GoogleApiClient следующим образом:

public void setLocationLocationRequest() {

        try {
            googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();

            locationRequest = new LocationRequest();
            locationRequest.setInterval(3000);
            locationRequest.setFastestInterval(3000);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            googleApiClient.connect();
        } catch (Exception e) {

    }

Здесь четким является LocationRequest.PRIORITY_HIGH_ACCURACY и интервал

locationRequest.setInterval(3000)

вот код реализации GoogleApiClient.

Этот раздел информации GPS приложения содержит параметр долготы широты и точности

Мои результаты: в onLocationChanged(Location location) я проверяю точность объекта Location таким образом: location.getAccuracy(). Здесь, если точность составляет менее 50 метров, я принимаю ее.

В 85% случаев он работает как шарм. Он отправляет мне точное местоположение из GPS. Но в 15% случаев он посылает мне неточное местоположение, как более> 300 метров.

15-процентное устройство - это недорогой мобильный бренд в Китае.

Мои вопросы:

  1. Как я могу сделать уровень точности около 99%. Есть ли проблемы в моей архитектуре кода?
  2. Точность GPS зависит от конфигурации устройства? если ДА, то что я могу сделать для устройства с низкой конфигурацией?
  3. Как работает Uber, Go-JEK и т.д., Работает на всех устройствах? Есть ли у них дополнительное кодирование только для GPS?
  4. Мое выражение для Бангладеш. Здесь интернет медленный. Это оказывает негативное влияние на точность GPS?

Заранее спасибо за эту тему. А также извините за плохой английский.

4b9b3361

Ответ 1

Обновления местоположения могут быть выполнены следующими способами:

  1. Местоположение, которое вы получаете от GPS, более точное, чем местоположение, которое вы получаете от сети, поэтому, если вам нужна точность, используйте GPS

  2. Не уверен в этом, но я думаю о том, какой тип местоположения вы хотите, как хотите, точную или самую быструю, поэтому в соответствии с этим выберите своего поставщика

  3. Поставщик FusedLocation является самым эффективным и эффективным решением для получения местоположения на Android сейчас, он собирает данные о местоположении из разных источников и в соответствии с переданными параметрами, как в том, сколько времени вы хотите, чтобы местоположение было обновлено, вам нужна высокая точность или нет и т.д.. Он предоставляет вам лучшее место.

  4. Да, вы должны использовать FusedLocationProvider для получения местоположения на android, так как google также рекомендует это, и это самый эффективный и эффективный способ получить местоположение на Android.

enter image description here

Почему бы вам не попробовать создать Criteria.ACCURACY_HIGH

Константа, указывающая требование высокой точности, может использоваться для горизонтальной, абсолютной высоты, скорости или точности подшипника. Для горизонтального и вертикального положения это примерно соответствует точности менее 100 метров.

Android пытается замаскировать реальность оборудования у нас, но на практике есть только два провайдера: GPS и сеть. Место GPS медленное, и не все устройства имеют его, но это точно. Расположение сети быстрее и поддерживается почти всеми устройствами, но оно менее точно.

Google улучшил свое управление картой и местоположением с помощью плавного провайдера.

Основная точка входа для взаимодействия с провайдером с плавным местоположением. Методы должны использоваться в сочетании с GoogleApiClient.


Код:

 new GoogleApiClient.Builder(context)
         .addApi(LocationServices.API)
         .addConnectionCallbacks(this)
         .addOnConnectionFailedListener(this)
         .build()

gps → (GPS, AGPS): имя провайдера местоположения GPS. Этот провайдер определяет местоположение с использованием спутников. В зависимости от условий этот провайдер может занять некоторое время, чтобы вернуть исправление местоположения. Требуется разрешение android.permission.ACCESS_FINE_LOCATION.

network -> (AGPS, CellID, WiFi MACID): имя поставщика сетевого местоположения. Этот провайдер определяет местоположение на основе доступности точек сотовой связи и точек доступа WiFi. Результаты извлекаются с помощью сетевого поиска. Требуется либо разрешение android.permission.ACCESS_COARSE_LOCATION, либо android.permission.ACCESS_FINE_LOCATION.


Другие опции:

getLastKnownLocation()

getLastKnownLocation() возвращает последнее известное местоположение... после того, как вы переустановите приложение, у него не будет никакого последнего известного местоположения... так что это приведет к тому, что NPE... вместо этого будет использоваться ниже кода

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            //here is the if-else change so code avoids falling into both loops
         // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            } else if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

Проверьте несколько лучших примеров, которые я нашел:

Это сработало для меня... должно работать для вас тоже...

Ответ 2

  • Как я могу сделать уровень точности около 99%. Есть ли какие-либо проблемы с моей архитектурой кода?

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

  1. a) Точность GPS зависит от конфигурации устройства?

ДА. Некоторые устройства могут иметь более старые GPS-чипы, которые могут отслеживать сигналы GPS (США), поскольку существуют другие системы позиционирования, такие как Galileo (Европа), ГЛОНАСС (Россия), QZSS (Япония) и Beidou (Китай). Чем больше поддержка чипсетов для этих типов, тем больше шансов вы сможете отслеживать больше спутников, тем самым фиксируя положение. Также TTFF (время до первого исправления) зависит от того, сколько каналов имеет приемник gps.

b) Если ДА, то что я могу сделать для устройства с низкой конфигурацией?

Так как это аппаратная проблема, вы ничего здесь не можете сделать. Но другие источники местоположения могут компенсировать отсутствие данных GPS, таких как AGPS (с поддержкой gps), Wi-Fi и сотовой позиционирования. Также есть некоторые платные опции, которые предоставляют базу данных для поиска вашего устройства с использованием точек доступа Wii и клещей (они утверждают, что они обеспечивают лучшее решение на Wi-Fi, но я не уверен, как я его не использую). Вы можете проверить его http://combain.com). Wi-Fi и cellid также зависят от того, сколько точек доступа Wi-Fi и ячеистой ячейки доступно и насколько они (сила сигнала). Если вам нужна точность 50 м, сотовая позиционирование не имеет ничего общего, но у wifi есть шанс приблизиться к этому значению.

Некоторые результаты исследования за 2009 год [3]

  • 3G iPhone w/A-GPS ~ 8 метров
  • 3G iPhone w/wifi ~ 74 м.
  • 3G iPhone w/Сотовая позиция ~ 600 метров
  1. Как работает Uber, Go-JEK и т.д., работает на всех устройствах? Есть ли у них дополнительное кодирование только для GPS?

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

  1. Мое приложение для Бангладеш. Здесь интернет медленный. Это оказывает негативное влияние на точность GPS?

Другие ответы утверждают, что Интернет не связан с GPS. Да, это правда, что это не связано с GPS, но местоположение. AGPS использует Интернет для извлечения 3 типов данных (спутниковые сигналы, альманах и эфемериды), которые помогают GPS быстрее фиксировать положение. Если эфемериды и альманах устарели или устройство переместилось на несколько сотен километров от предыдущей позиции, то это называется холодным запуском и занимает около 12-15 минут без AGPS.

Поставщик плавного доступа уже знает, как обеспечить наилучшее решение с этими конфигурациями, поэтому вы должны его благословить.

Литература:

Ответ 3

+1 для описания, о котором идет речь.
Надеюсь, мы найдем лучший ответ на ваш вопрос и со временем лучше, из того, что я знаю... здесь не будет только одного правильного ответа.

Сначала (и второй)

  • Как я могу сделать уровень точности около 99%. Есть ли проблемы в моей архитектуре кода?

  • Точность GPS зависит от конфигурации устройства? если ДА, то что я могу сделать для устройства с низкой конфигурацией?

Здесь важны обе конфигурации устройств и архитектура кода. Если вы уже достигли 85% успеха, архитектура кода в порядке, я думаю.
Что касается GPS, то прямая видимость является важным фактором, когда речь заходит о конфигурации и точности устройства. Хотя мобильный телефон с низкой стоимостью может возвращать точное местоположение с четкой прямой видимостью. Вы можете попробовать запустить еще 2 цикла/ожидания, чтобы достичь более высокой точности.

В худшем случае и для чего стоит, вы также можете попробовать найти местоположение, используя LocationManager и технику поставщика GPS, которая работает как резерв в 15% только для сравнения и обеспечения того, что вы используете наиболее точное место, которое вы можете получить. Стратегии местоположения помещают его как

В большинстве случаев вы получите более высокую производительность батареи, а также больше соответствующую точность, используя API служб местоположения.

  1. Как работает Uber, Go-JEK и т.д. приложения для работы на всех устройствах? Есть ли у них дополнительное кодирование только для GPS?
    Они работают, но не всегда с максимальной точностью для местоположений, полученных в приложении. Если у нас есть какие-то хаки для местоположения, нам нужно их найти, возможно, результат поиска в 5-й странице:) или получить выгоду из среды с открытым исходным кодом. Для меня достаточно передового опыта и ссылок на репозиторий android. Вы уже следовали за сообщениями, например Получить обновления местоположения

  2. Мое приложение для Бангладеш. Здесь интернет медленный. Это оказывает негативное влияние на точность GPS?
    Нет связи между Интернетом и LocationManager + GPS_PROVIDER