【发布时间】:2016-07-25 03:08:51
【问题描述】:
在花费大量时间进行实验并尝试了多种调用和设置组合之后,我缩小了范围:
Google Play 服务定位 API FusedLocationApi.requestLocationUpdates 理想情况下应该在任何定位服务开启时在指定的时间间隔内调用 onLocationChanged。但是,实际行为很奇怪,是这样的:
- 如果所有定位服务都关闭,它永远不会调用
onLocationChanged....... 预期行为 - 如果只开启wifi/移动网络定位服务,则永远不会调用
onLocationChanged....... 意外行为 - 如果只开启GPS定位服务,它永远不会调用
onLocationChanged(即使我们之后开启wifi定位服务).......意外行为 - 如果 GPS 定位服务打开(在打开第一个 wifi/移动定位服务后),它会调用
onLocationChanged(并且即使在我们关闭 GPS 之后也会继续调用).......预期行为李> - 如果开启wifi定位服务(开启第一个GPS定位服务后),它永远不会调用
onLocationChanged....... 意外行为
简而言之:只有在我们先打开wifi再打开GPS之后,它才会调用onLocationChanged。 (但是,之后不再需要 GPS 来调用onLocationChanged)
这是我的代码:
void ConnectToLocationApi()
{
// Create an instance of GoogleAPIClient.
if(m_GoogleApiClient == null)
{
// Initialize Google Api client
m_GoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
// Connect to Google play service location api
m_GoogleApiClient.connect();
}
}
@Override
public synchronized void onConnected(Bundle bundle) // Called when m_GoogleApiClient.connect() succeeds
{
Log.d(TAG, "GoogleApiClient connected");
try
{
LocationRequest locationRequest;
// Initialize location request
locationRequest = new LocationRequest();
locationRequest.setInterval(LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS);
locationRequest.setFastestInterval(FASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Start receiving location updates
LocationServices.FusedLocationApi.requestLocationUpdates(m_GoogleApiClient, locationRequest, this);
// Get location details of last available location (if any)
Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(m_GoogleApiClient);
if (lastLocation != null)
{
ShowToast(this, "Last location received", Toast.LENGTH_SHORT);
Log.i(TAG, "In onConnected. Latitude:" + m_Location.getLatitude() + ", Longitude: " + m_Location.getLongitude());
}
else
{
Log.e(TAG, "getLastLocation returned NULL value");
}
}
catch (SecurityException e)
{
Log.e(TAG, "getLastLocation failed because of security exception (permission issue?)");
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) // Called when m_GoogleApiClient.connect fails
{
ShowToast(this, "GoogleApiClient connection failed", Toast.LENGTH_SHORT);
m_GoogleApiClient = null;
Log.e(TAG, "GoogleApiClient connection failed");
}
@Override
public void onConnectionSuspended(int i) // Called when m_GoogleApiClient.connect suspended
{
Log.e(TAG, "GoogleApiClient connection suspended");
}
@Override
public synchronized void onLocationChanged(Location location)
{
ShowToast(this, "Location update received", Toast.LENGTH_SHORT);
Log.i(TAG, "In location changed. Latitude:" + location.getLatitude() + ", Longitude: " + location.getLongitude());
}
注意:在阅读this 之后,我更喜欢 Google Play 服务位置 API 而不是 Android 框架位置 API。请问有什么线索吗?我被严重卡住了。
【问题讨论】:
-
您能否描述一下您是如何进行 wifi/移动位置检查(物理设备移动 x 米,模拟位置提供商)和使用的物理设备的?
-
使用的物理设备。但是,当我要求定期更新时,不需要移动。它会每隔
LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS/1000秒持续调用一次回调。 -
LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS 和 FASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS 使用什么值
-
5 秒和 1 秒。 (
LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS = 5000andFASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS = 1000) 在问题中的第 4 种情况下它可以完美运行。 -
我刚刚浪费了大约 2 天的生命。感谢cmets。现在的问题是我们如何编写高质量的基于位置的应用程序? Google 对其进行排序
标签: android google-play-services locationmanager