моя цель - периодически получать обновления местоположения от поставщика сети с использованием метода requestlocationupdate() в течение определенных интервалов (x сек), а затем выполнять метод LocationManager.removeUpdates() для удаления обновлений и достижения мощности потребление должно быть как можно меньше,периодически получать обновления сетевых провайдеров
Проблема, с которой я столкнулся, - это метод requestlocationupdate(), вызываемый и вызывающий метод onlocationchanged каждые 45 секунд, даже его «mintime» (второй параметр в этом методе) меньше 45! , почему это происходит?
также, вторая проблема возникает в течение каждого интервала, мне нужно вызвать метод requestlocationupdates и записать текущую широту и долготу местоположения пользователя и сравнить его с записанной широтой и долготой последнего местоположения, если ее одно и то же (пользователь все еще неподвижен), отобразите «ваше последнее местоположение ...», если произойдет изменение местоположения, отобразите «ваше обновленное местоположение ...».
как я могу это сделать?
Я попытался решить эту проблему, используя метод handler.post (myRunnable) и вызов объекта runnable с классом timertask для выполнения метода requestlocationupdates() каждый (хсек), который определяется в параметрах входных данных timertask.
, когда я тестировал этот код, он получает широту и долготу каждые х сек, но записанные значения меняются даже в том же месте!
также, пишет любой код в onlocationchanged() метод переопределения представляет собой хороший подход со стороны энергосбережения?
также, можете ли вы рассказать мне, как я могу получить точность любого поставщика сети (Wi-Fi/3G)?
Любая помощь будет очень признательна!
Кодекс выглядит как:
intializations:
Timer t1;
Timer t2;
TimerTask mTimerTask1;
TimerTask mTimerTask2;
Handler hand;
Handler hand1;
public LocationManager locationManager;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
double Altitude; // longitude
double accuracy; // accuracy
// The minimum distance to change notifications Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 0 meters
// The minimum time between notifications updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 10; // 10 sec
Handler часть:
Runnable run1 = new Runnable() {
public void run() {
mTimerTask1 = new TimerTask() {
public void run() {
hand.post(new Runnable() {
public void run() {
if(check_conectivity()){
//flag1=false;
get_location();
time++;
}
}
});
}
};
t1.scheduleAtFixedRate(mTimerTask1, 0, 10000);
}
};
метод check_connectivity:
public boolean check_conectivity(){
// put the reference LocationManger
locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
// getting network status
// isProviderEnabled ==> Returns the current enabled/disabled status of the NETWORK_PROVIDERr.
// If the user has enabled this provider in the Settings menu, true is returned otherwise false is returned
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isNetworkEnabled) {
// no network provider is enabled
showSettingsAlert();
return false;
}
else{
return true;
}
}
метод get_location:
public void get_location(){
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
onlocationchanged() метод коррекции:
if (locationManager!= null){
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
tv2.setText("Your last Location is - \nLat: " + latitude + "\nLong: " + longitude);
tv3.setText("Last estimeted location number : " + time1);
time1++;
stopUpdating();
Если я хочу получить точность сетевого провайдера, могу ли я использовать location.getAccuracy()? это выгодно? –
уверен, 'getAccuracy' возвращает значение в метрах. если точность, например, 10, это означает, что GPS с 95% догадывается о вашем местоположении в радиусе 10 метров. –
это правильно для GPS, но для Networkprovider, я получаю значение точности, равное 45 или 50, означает ли это, что networkprovider с 68% догадывается о моем местоположении в радиусе 45 метров? –