Как встроить в приложение встроенный GPS-локер, например, «GPS Connected»? - PullRequest
2 голосов
/ 27 января 2020

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

Location.getLatitude()
Location.getLongitude()

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

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

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

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

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

1 Ответ

1 голос
/ 11 февраля 2020

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

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

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

В функции getLocation () обновления выполняются только в том случае, если сеть подключена или GPS активна, но также соответственно к 2 другим условиям: 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);

Код для periodi c runnable + handler:

    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;
}

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

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)

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

...