Android получить местоположение от лучшего доступного провайдера

У меня есть этот код, чтобы получить лучшего доступного провайдера

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

locationListener = new MyLocationListener();
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String provider = lm.getBestProvider(criteria, true);
Location mostRecentLocation = lm.getLastKnownLocation(provider);
if(mostRecentLocation != null) {
    latid=mostRecentLocation.getLatitude();
    longid=mostRecentLocation.getLongitude();
}
lm.requestLocationUpdates(provider, 1, 0, locationListener);

а потом слушатель

private class MyLocationListener implements LocationListener {

@Override
public void onLocationChanged(Location loc) {
  if (loc != null) {
    latid = loc.getLatitude();
    longid = loc.getLongitude();
    // if(loc.hasAccuracy()==true){
    accuracyd = loc.getAccuracy();
    String providershown = loc.getProvider();    
    accuracy.setText("Location Acquired. Accuracy:"
      + Double.toString(accuracyd) + "m\nProvider: "+providershown);
    accuracy.setBackgroundColor(Color.GREEN);
    // }
    userinfo=usernamevalue+"&"+Double.toString(latid)+"&"+Double.toString(longid);
    submituserlocation(userinfo);
   }
}

Когда я протестировал его на устройстве (htc magic), я обнаружил, что при отключении gps он сразу блокируется от сети. Когда я включаю GPS, он не берет никаких данных из сети и ждет, пока он не заблокируется от GPS.
Я хотел бы заблокировать положение, как карты Google, которые, пока у них нет хорошего сигнала GPS, они используют сеть для определения мое местоположение.
Хотя я считаю, что это было бы лучшим критерием, но они выбирают поставщика один раз.
Что-то не так с моим кодом или мне нужно использовать потоки, тайм-ауты и т. д., чтобы это произошло?


person spagi    schedule 27.05.2010    source источник
comment
spagi, ваш код мне очень помог - нигде на сайте разработчиков Android не объясняется, как получить наилучшего поставщика. Некоторые устройства могут иметь GPS, некоторые GSM, некоторые Wi-Fi.   -  person Hein du Plessis    schedule 16.02.2011
comment
Вот очень интересная статья Google: developer.android.com/training/basics/ местоположение/   -  person shkschneider    schedule 16.10.2012


Ответы (2)


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

person capecrawler    schedule 27.05.2010
comment
Поэтому я делаю 2 прослушивателя местоположения, один для GPS и один для сети, и инициализирую их обоих с помощью requestLocationUpdates. Я могу слушать их обоих тогда с одним onLocationChanged? - person spagi; 27.05.2010
comment
Да, вы должны слушать обоих. Вы даже можете использовать lastKnownLocation до того, как будет получено обновление от любого провайдера. - person Fedor; 27.05.2010
comment
Вы можете добавить переменную Location в свой MyLocationListener и установить ее значение в onLocationChanged(). В своем основном действии создайте два экземпляра MylocationListener, один для GPS, а другой для сетевого провайдера. Слушайте оба с определенного промежутка времени (вы можете реализовать это, создав поток таймера), а когда время истекло, прекратите прослушивание и сначала проверьте переменную местоположения в gpslistener, если таковая имеется, иначе проверьте networklistener. - person capecrawler; 28.05.2010
comment
Если вам все равно, от какого поставщика исходит ваше местоположение (например, GPS или сеть), вы можете использовать один и тот же LocationListener для обоих. Вы можете подписаться на них, используя: manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocationListener) для GPS или manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, myLocationListener) для сетевых местоположений. Вы можете изменить нули, чтобы настроить производительность (первый ноль — это минимальное время между обновлениями, второй — минимальное количество метров, сдвинутых до получения обновления). - person AgentKnopf; 10.09.2012

Возможно, вы можете использовать getBestProvider (Criteria criteria, boolean enabledOnly) из LocationManager с критериями, как в этот другой поток. См. официальную документацию< /а>.

Надеюсь, поможет

person Filippo Mazza    schedule 07.07.2012