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