2

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

Im с помощью Google Play услуги местоположение апи как это:

LocationRequest locationRequest = LocationRequest.create(); 
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
locationRequest.setNumUpdates(1); 
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest, this); 
mLocationHandler.sendEmptyMessageDelayed(0, 15000); // Time out location request 

У меня есть обработчик mLocationHandler, который аннулирует locationRequest после 15 секунд, так как я не хочу, чтобы пользователь ждать слишком долго.

Есть ли какой-либо способ, как я могу попытаться получить не столь точное местоположение, если точное местоположение с высокой точностью?

ответ

3

Вы можете попробовать это после того, как тайм-аут,

Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

Это даст вам последнее известное местоположение и проверьте точность лучше, чем то, что вы получили от геоданных.

Обновите обновления что-то вроде этого:

final LocationRequest REQUEST = LocationRequest.create() 
     .setInterval(16)   
     .setFastestInterval(16) // 16ms = 60fps 
     .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

Это гарантирует, что вы будете иметь обновления. Затем вы можете сократить время ожидания не более чем на секунду, должно быть достаточно. После этого вы можете удалить locationupdaterequest так:

if(mGoogleApiClient.isConnected()) {    
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);    
} 
+0

В вашем месте обновления вы, вероятно, хотите, чтобы запросить как можно больше места, как это возможно в вашем интервале (задержки) Затем выберите лучший. –

+0

Тогда проблема в том, что в некоторых случаях я не получаю никаких обновлений местоположения в моем интервале (15 секунд). Может быть, мне нужно установить приоритет чего-то другого с высокой точностью? – devha

+0

изменить свое местоположениеОбновить. Проверьте мой обновленный ответ. –

1

Я использую внешнюю библиотеку для этого: Android-ReactiveLocation. Проверьте раздел Cooler examples, который представляет именно то, что вы хотите:

LocationRequest req = LocationRequest.create() 
         .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
         .setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS)) 
         .setInterval(LOCATION_UPDATE_INTERVAL); 

Observable<Location> goodEnoughQuicklyOrNothingObservable = locationProvider.getUpdatedLocation(req) 
      .filter(new Func1<Location, Boolean>() { 
       @Override 
       public Boolean call(Location location) { 
        return location.getAccuracy() < SUFFICIENT_ACCURACY; 
       } 
      }) 
      .timeout(LOCATION_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS, Observable.just((Location) null), AndroidSchedulers.mainThread()) 
      .first() 
      .observeOn(AndroidSchedulers.mainThread()); 

goodEnoughQuicklyOrNothingObservable.subscribe(...); 
Смежные вопросы