应用程序获取错误的位置,直到打开内置的Google Map应用程序

我开发了一个用来查找设备当前位置的应用程序。 我已经使用Fused Location API获取当前位置。

我面临着很奇怪的问题,在一些设备中,我没有得到准确的当前位置,直到我打开内置的Google Map,一旦我打开Goog​​le Map并返回到当时的应用程序,返回确切的位置。

这是我的位置请求。

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

谁能告诉我什么是错的? 你的帮助真的很感激。

Solutions Collecting From Web of "应用程序获取错误的位置,直到打开内置的Google Map应用程序"

所以Waze和我们过去使用过FusedLocation,并且遇到了很多问题。 API被破坏。 有一些设备没有正确的使用它。 活动承认,融合了很多接力没有工作,并适当地承认工作人员。 我们结束,切换回位置pipe理器API。

这里的片段:

初始化位置pipe理器并开始请求不同线程上的更新。 我亲自为每个供应商注册单独的听众

 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); } } } 

不要忘记取消注册并停止所有线程:)

创buildLocationRequest时,必须将setPriority()设置为PRIORITY_NO_POWER。

PRIORITY_NO_POWER意味着您的应用程序将永远不会得到任何位置,除非手机中的其他应用程序请求了位置并收到它。 阅读更多的LocationRequest 。

我不知道这个,但最后我看到这样的事情,那个手机并没有专门的GPS。 它只有一个GPS。

在玩了很多时间之后,我意识到这是我没有得到准确位置的原因。 但打开地图后,出于某种原因位置是准确的。 即使手机没有专用的GPS,Google也会在地图上做很多其他的事情来获取准确的地图位置。 只需检查设备及其硬件规格。

你们是在testing棉花糖还是以上的版本?
在比棒棒糖更高的设备上,您必须在运行时请求“位置”权限。 请参阅此链接http://developer.android.com/training/permissions/requesting.html
因此,您将无法获得位置信息,因此无法返回准确的位置信息,但是当您启动已具有Gps权限的Google地图应用时,系统会在Google Play服务中更新您的位置信息。 所以你也开始显示正确的位置,因为位置最终是从Google play服务获取的。