Обновить широту / долготу или загрузить быстрее - PullRequest
0 голосов
/ 25 августа 2011

Я использую lat / lng, чтобы найти, где находится мой пользователь, и рассчитать расстояние между ним и другим местом на карте (его lat / lng является статическим). Для этого я использую:

 private void findloc() {
            // TODO Auto-generated method stub

            try{
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            provider = locationManager.getBestProvider(criteria, false);
            Location location = locationManager.getLastKnownLocation(provider);
            Double lat = Double.valueOf(location.getLatitude());
            Double lng = Double.valueOf(location.getLongitude());

            Location location2 = new Location("gps");
            location2.setLatitude(35.519583);
            location2.setLongitude(24.016864); 


            float distance = location2.distanceTo(location);  
             TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm);
             sitesdistancekm.setText("Geographical Distance : "+distance/1000+" km");


             Toast.makeText(otto.this, "lat: "+lat+"\nlng: "+lng,
            Toast.LENGTH_LONG).show();
        }
             catch(Exception e){

                 TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm);
                 sitesdistancekm.setText("No GPS signal");      


            }
        }

Моя проблема в том, что иногда расположение складывается, и я получаю неправильное расстояние. Я вызываю findloc () как обновление для меню, но оно не меняется.

public boolean onOptionsItemSelected(MenuItem item) {

                 findloc();

        return true;
    } 

Есть ли способ улучшить его? Любая идея, пожалуйста?

EDIT

Это сработает?

 private void findloc() {
            // TODO Auto-generated method stub

            try{
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            provider = locationManager.getBestProvider(criteria, false);
            Location location = locationManager.getLastKnownLocation(provider);
            Double lat = Double.valueOf(location.getLatitude());
            Double lng = Double.valueOf(location.getLongitude());

            location2 = new Location("gps");
            location2.setLatitude(35.519583);
            location2.setLongitude(24.016864); 


            float distance = location2.distanceTo(location);  
             TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm);
             sitesdistancekm.setText("Geographical Distance : "+distance/1000+" km");


             Toast.makeText(otto.this, "lat: "+lat+"\nlng: "+lng,
            Toast.LENGTH_LONG).show();


             onLocationChanged(location);

        }
             catch(Exception e){

                 TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm);
                 sitesdistancekm.setText("No GPS signal");      


            }
        }

        private void onLocationChanged(Location location) {
        // TODO Auto-generated method st


            float distance = location2.distanceTo(location);  
             TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm);
             sitesdistancekm.setText("Geographical Distance : "+distance/1000+" km");
    }

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Я обнаружил, что getLastKnownLocation () не так надежен, как регистрация прослушивателя местоположения. См. этот пост для хорошей информации о том, как его реализовать.

getLastKnownLocation docs state:

Возвращает местоположение с указанием данных из последнего известного местоположения исправить получено от данного провайдера. Это можно сделать без запуск провайдера. Обратите внимание, что это место может быть устаревшим, например, если устройство было выключено и перемещено в другое место.

Для меня я использую getLastKnownLocation (), чтобы получить начальное местоположение, но затем регистрирую слушателя для чего-либо еще.

1 голос
/ 26 августа 2011

Ссылаясь на ответ Джека, getLastKnownLocation не следует использовать как единственную меру определения местоположения. Вам нужно разделить логику определения местоположения на несколько шагов:

  • Получите лучшего поставщика для точной детализации


    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);  
    Criteria criteria = new Criteria();

    // you need to specify the criteria here
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    String bestProvider = lm.getBestProvider(criteria, true);

  • Однако вы не можете просто использовать последнюю известную позицию как есть. Вам нужно проверить, когда в последний раз это местоположение исправлялось. В зависимости от необходимой вам чувствительности, вы можете проверить, сколько времени прошло от 30 секунд до 5 минут.

    Location locate = lm.getLastKnownLocation(bestProvider);
    if(System.currentTimeMillis() - locate.getTime() < TIME_TO_EXPIRE) {
        // this is a valid location, let's use this location 
        // as the last time the provider check is within reasonable boundary
    }

  • Если последнее известное обновление перешло границы ожидаемого времени, вы можете предположить, что местоположение слишком старое (пользователь переместился в другое место) и нуждается в обновлении. Следующий шаг для вас - запросить обновление местоположения, позвонив по номеру

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
MIN_TIME,  MIN_DISTANCE, locationListener);

Как видите, вы не вызываете onLocationChange вручную, а вместо этого позволяете провайдеру вызывать прослушиватель, если были превышены MIN_TIME и MIN_DISTANCE.

  • Обратите внимание, что если ваша позиция не изменилась, onLocationChanged () не будет вызван. Если определенный период прошел без вызова onLocationChanged, вы можете предположить, что ваша последняя известная позиция является наиболее точной, и вам следует ее использовать.

  • Существует также вероятность того, что onLocationChanged () не будет вызван, потому что поставщик не может получить исправление для вашей позиции. В этом случае, при желании, вы можете позвонить другим поставщикам, чтобы узнать, могут ли они предоставить вам обновление местоположения, прежде чем вернуться к последней известной позиции

...