Как иметь встроенный GPS-блокировщик, например GPS Connected, в приложении?

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

Location.getLatitude()
Location.getLongitude()

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

Если кто-то их знает, функция приложения GPS Connected и подобных приложений, таких как GPS Fix, GPS Locker, делает именно то, что я хочу.

Я хотел бы воспроизвести это в своем приложении, поэтому мне не нужно устанавливать и запускать это дополнительное приложение.

Я не могу найти какой-либо открытый код для этого.

Кто-нибудь может помочь?


person Frederik    schedule 27.01.2020    source источник
comment
Привет и добро пожаловать. Не нужно ставить теги в заголовке.   -  person Federico klez Culloca    schedule 27.01.2020
comment
@FedericoklezCulloca: Хорошо, спасибо за исправление и помощь.   -  person Frederik    schedule 27.01.2020
comment
В качестве обновления: я и мой коллега пытаемся реализовать постоянное обновление местоположения с постоянным циклом, который будет работать в фоновом режиме приложения через службу.   -  person Frederik    schedule 10.02.2020


Ответы (1)


После долгих поисков и советов из нескольких источников мы нашли человека, который делает то, что может быть тем, что мы ищем:

Получение местоположения пользователя в Android, когда телефон заблокировано

Этот человек ищет решение для обновления своего местоположения GPS, даже когда его экран заблокирован, но тем временем реализовал то, что я считаю решением моей проблемы: запуск службы, в которой местоположение извлекается с помощью функции getLocation(). Эта функция периодически вызывается в сервисе исполняемым+обработчиком с произвольным интервалом времени UPDATE_CYCLE_PERIOD.

В функции getLocation() обновления выполняются только в том случае, если сеть подключена или GPS активен, а также в соответствии с двумя другими условиями: MIN_TIME_BW_UPDATES и MIN_DISTANCE_CHANGE_FOR_UPDATES, вызываемыми методом с именем locationManager.requestLocationUpdates(). Мы до сих пор не уверены, что именно это делает, но предполагается, что это просто определяет условия обновления для locationManager.

Код для этого конкретного метода, вызываемого внутри getLocation():

locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, //Or .GPS_PROVIDER
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

Код для периодического обработчика runnable+:

    handler = new Handler();
    runnable = new Runnable() {
        public void run() {
           location = getLocation();
           handler.postDelayed(runnable, UPDATE_CYCLE_PERIOD);
        }
    };

Код для этой функции

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;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // 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 Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

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

    return location;
}

Числовые значения, которые мы определяем для этих трех переменных:

UPDATE_CYCLE_PERIOD = 5 sec (10 sec originally)

MIN_DISTANCE_CHANGE_FOR_UPDATES = 1 meter (10 meters originally)

MIN_TIME_BW_UPDATES = 1 sec  (1 min originally)

Мы предполагаем, что можем имитировать эффект функции блокировки GPS приложения «GPS Connected» за счет сверхчастых и сверхточных обновлений — если это приложение вообще делает то же самое. Нам, вероятно, придется протестировать и оптимизировать потребление батареи, поскольку эти значения кажутся чрезвычайно потребляющими. Здесь приветствуются любые комментарии.

person MSG    schedule 11.02.2020
comment
Может ли кто-нибудь с большими правами отметить или проголосовать как ответ? - person Frederik; 11.02.2020