2016-02-17 3 views
10

Я разработал одно приложение, которое используется для поиска текущего местоположения устройства. Я использовал Fuse Location API для получения текущего местоположения.Приложение, получившее неправильное расположение до открытия встроенного приложения Google Map

Я столкнулся с очень странной проблемой, в некоторых устройствах я не получаю точное текущее местоположение, пока не открою встроенную карту Google, как только я открою карту Google и вернусь к моему приложению, в то время приложение вернет точное местоположение.

Вот мой запрос о местоположении.

mLocationRequest = new LocationRequest(); 
mLocationRequest.setInterval(UPDATE_INTERVAL); 
mLocationRequest.setFastestInterval(FATEST_INTERVAL); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters 

Может ли кто-нибудь сказать мне, что случилось? Ваша помощь очень ценится.

+0

Что вы LocationRequest? –

+3

У вас есть 33k очков. Должны ли я угадывать конкретные ценности? Пожалуйста, поместите его в вопрос не в комментариях. Была ли высокая точность включена в настройках телефона? Сколько обновлений местоположения вы получили? На каких устройствах вы тестировали? Какая версия библиотеки GMS используется? Все, что вы можете придумать, помогает. –

+1

Был участником в течение 5 лет, по-прежнему опубликовал код в комментариях. Oh boy ... – 2Dee

ответ

3

Итак, Waze и мы использовали FusedLocation в прошлом и столкнулись с множеством проблем. API сломан. Есть некоторые устройства, которые не работают должным образом. Распознавание активности, в результате чего много реле не работает и правильно распознает персонал. Мы заканчиваем переход к API-интерфейсу менеджера местоположений.

Вот фрагмент кода:

Init менеджер место и начать запрашивать обновления на другом потоке. я лично зарегистрировать прослушиватель для каждого поставщика

if (mLocationManager == null) { 
     LOGGER.info("Location track,start called first time. Creating Location Manager"); 
     mLocationManager = (LocationManager) mContextWeakReference.get() 
       .getSystemService(Context.LOCATION_SERVICE); 

     mLocationHandlerThread 
       = new HandlerThread("LocationThread", Thread.NORM_PRIORITY); 
     mLocationHandlerThread.start(); 
     // Now get the Looper from the HandlerThread 
     // NOTE: This call will block until the HandlerThread gets control and initializes its Looper 
     Looper looper = mLocationHandlerThread.getLooper(); 
     Location networkLastKnownLocation = null; 
     Location gpsLastKnownLocation = null; 
     mGpsLocationListener = new GpsLocationListener(); 
     mNetworkLocationListener = new NetworkLocationListener(); 

     // Register the listener with the Location Manager to receive location updates 
     if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
        LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, 
        mGpsLocationListener, 
        looper); 

      gpsLastKnownLocation = mLocationManager 
        .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     } else { 
      setGpsProviderAvailable(false); 
     } 
     if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) { 
      networkLastKnownLocation = mLocationManager 
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
        LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, 
        mNetworkLocationListener, 
        looper); 
     } 

     setLastKnownLocationDifferentProviders(gpsLastKnownLocation, 
       networkLastKnownLocation); 

    } 

И слушатели являются:

public class GpsLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.GPS_PROVIDER: 
       if (mLocationManager != null) { 
        mLocationManager.removeUpdates(mNetworkLocationListener); 
       } 
       break; 
     } 
     setLastKnownLocation(location); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

public class NetworkLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.NETWORK_PROVIDER: 
       setLastKnownLocation(location); 
       break; 
     } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

Не забыл отменить и прекратить все темы :)

+0

Всегда ли мне нужен отдельный поток для этого слушателя? Мой пользователь идет относительно медленно, и мне не нужны высокочастотные обновления; Кроме того, место просто подталкивается для дальнейшей обработки: ничто не застрянет в потоке пользовательского интерфейса. –

+0

Другой вопрос: есть вся эта мудрость, как отфильтровывать «неправильные» обновления местоположения. –

+1

1. Нет. Для этого вам не нужна отдельная нить. Вы можете использовать тот же поток пользовательского интерфейса, чтобы получить onLocationChange 2. Это совершенно другая история :) Нужно написать книгу, как отфильтровывать плохие места –

0

Я не уверен в этом, но в последнее время я видел что-то подобное, что у телефона не было выделенного GPS. У него был только GPS-приемник.

После долгого разговора я понял, что именно по этой причине я не получал точное местоположение. Но после открытия карт по какой-то причине местоположение было точным. Google определенно делает много других вещей на картах, чтобы получать точное местоположение на картах, даже если на телефоне нет выделенного GPS. Просто проверьте устройства и их аппаратные спецификации.

0

При создании LocationRequest у вас должно быть установлено значениеPriority() для PRIORITY_NO_POWER.

PRIORITY_NO_POWER означает, что ваше приложение никогда не получит никакого места, если другое приложение в телефоне не запросило места и не получил его. Читайте больше на LocationRequest.

+0

Вы показываете, как проблема может быть надежно * воспроизведена *, а не как ее можно исправить. –

0

Вы, ребята, тестируете устройство Marshmallow или выше?
В устройствах выше Lollipop, вы должны запросить разрешение на размещение во время выполнения. Обратитесь к этой ссылке http://developer.android.com/training/permissions/requesting.html
Таким образом, у вас не было бы разрешения на размещение, поэтому оно не вернет точное местоположение, но когда вы запустите приложение Map, у которого уже есть разрешение Gps, вы обновите свое местоположение в сервисе Google Play. Таким образом, вы также начинаете показывать правильное местоположение, потому что местоположение в конечном итоге извлекается из службы Google Play.

+0

Неправильно. Приложение помечено как таргетинг на Lollipop, и поэтому даже на Marshmallow разрешения работают по-старому. Кроме того, обновления местоположения поступают, но менее точные, чем с Картами. Кроме того, если я переключусь на провайдера местоположения GPS с плавкого предохранителя, обновления работают просто отлично. –