2013-09-13 3 views
0

моя цель - периодически получать обновления местоположения от поставщика сети с использованием метода 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(); 

ответ

0

вы можете сказать мне, как я могу получить точность любого поставщика сети (WiFi/3G)

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

первый прочь вы можете использовать postDelayed вместо post:

private int mSampleDurationTime = 10000; // 10 sec for example 
...  
mHandler.postDelayed(mRunnable, mSampleDurationTime);` 

второй вы можете попытаться получить «лучшее место», описанный в одном из моих ответов, смотрите ссылку here

надеюсь, что это поможет,

+0

Если я хочу получить точность сетевого провайдера, могу ли я использовать location.getAccuracy()? это выгодно? –

+0

уверен, 'getAccuracy' возвращает значение в метрах. если точность, например, 10, это означает, что GPS с 95% догадывается о вашем местоположении в радиусе 10 метров. –

+0

это правильно для GPS, но для Networkprovider, я получаю значение точности, равное 45 или 50, означает ли это, что networkprovider с 68% догадывается о моем местоположении в радиусе 45 метров? –

Смежные вопросы