После долгих поисков и советов из нескольких источников мы нашли человека, который делает то, что может быть тем, что мы ищем:
Получение местоположения пользователя в 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