在打开内置 Google 地图应用程序之前,应用程序获取错误位置
Application getting wrong location until open inbuilt Google Map application
我开发了一款用于查找设备当前位置的应用程序。我使用 Fused Location API 来获取当前位置。
我遇到了一个非常奇怪的问题,在某些设备中,我无法获得准确的当前位置,直到我打开内置 Google 地图,一旦我打开 Google 地图并回到我的应用程序时间申请 return 确切位置。
这是我的位置请求。
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters
谁能告诉我哪里出了问题?非常感谢您的帮助。
我不确定,但上次我看到这样的东西,phone 没有专用的 GPS。它只有一个全球定位系统。
在摸索了很久之后,我意识到这就是我无法获得准确位置的原因。但是打开地图后,不知为什么位置是准确的。即使 phone 没有专用 GPS,Google 肯定会在地图上做很多其他事情来获取地图上的准确位置。只需检查设备及其硬件规格。
创建 LocationRequest 时,您必须将 setPriority() 设置为 PRIORITY_NO_POWER。
PRIORITY_NO_POWER 意味着您的应用永远不会获得任何位置,除非 phone 中的其他应用已请求位置并收到。在 LocationRequest.
阅读更多内容
你们是在 Marshmallow 或更高版本的设备上测试吗?
在 Lollipop 以上的设备中,您必须在 运行 时请求位置权限。参考这个 link http://developer.android.com/training/permissions/requesting.html
所以你没有位置权限,因此它不会 return 准确的位置但是当你启动已经有 Gps 权限的地图应用程序时,将在 Google 播放服务中更新您的位置。所以你也开始显示正确的位置,因为位置最终是从 Google 播放服务中获取的。
Waze 和我们过去使用 FusedLocation 时遇到了很多问题。
API 坏了。有些设备不能正确执行它。 Activity 识别融合了很多继电器不工作并正确识别工作人员。
我们结束,切换回位置管理器 API.
这里是片段:
初始化位置管理器并开始请求不同线程上的更新。
我亲自为每个提供者注册单独的监听器
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);
}
}
}
别忘了注销并停止所有线程:)
我开发了一款用于查找设备当前位置的应用程序。我使用 Fused Location API 来获取当前位置。
我遇到了一个非常奇怪的问题,在某些设备中,我无法获得准确的当前位置,直到我打开内置 Google 地图,一旦我打开 Google 地图并回到我的应用程序时间申请 return 确切位置。
这是我的位置请求。
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters
谁能告诉我哪里出了问题?非常感谢您的帮助。
我不确定,但上次我看到这样的东西,phone 没有专用的 GPS。它只有一个全球定位系统。
在摸索了很久之后,我意识到这就是我无法获得准确位置的原因。但是打开地图后,不知为什么位置是准确的。即使 phone 没有专用 GPS,Google 肯定会在地图上做很多其他事情来获取地图上的准确位置。只需检查设备及其硬件规格。
创建 LocationRequest 时,您必须将 setPriority() 设置为 PRIORITY_NO_POWER。
PRIORITY_NO_POWER 意味着您的应用永远不会获得任何位置,除非 phone 中的其他应用已请求位置并收到。在 LocationRequest.
阅读更多内容你们是在 Marshmallow 或更高版本的设备上测试吗?
在 Lollipop 以上的设备中,您必须在 运行 时请求位置权限。参考这个 link http://developer.android.com/training/permissions/requesting.html
所以你没有位置权限,因此它不会 return 准确的位置但是当你启动已经有 Gps 权限的地图应用程序时,将在 Google 播放服务中更新您的位置。所以你也开始显示正确的位置,因为位置最终是从 Google 播放服务中获取的。
Waze 和我们过去使用 FusedLocation 时遇到了很多问题。 API 坏了。有些设备不能正确执行它。 Activity 识别融合了很多继电器不工作并正确识别工作人员。 我们结束,切换回位置管理器 API.
这里是片段:
初始化位置管理器并开始请求不同线程上的更新。 我亲自为每个提供者注册单独的监听器
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);
}
}
}
别忘了注销并停止所有线程:)