【问题标题】:FusedLocationApi.requestLocationUpdates gets trigger to call onLocationChanged only after GPS is turned onFusedLocationApi.requestLocationUpdates 仅在 GPS 开启后触发调用 onLocationChanged
【发布时间】:2016-07-25 03:08:51
【问题描述】:

在花费大量时间进行实验并尝试了多种调用和设置组合之后,我缩小了范围:

Google Play 服务定位 API FusedLocationApi.requestLocationUpdates 理想情况下应该在任何定位服务开启时在指定的时间间隔内调用 onLocationChanged。但是,实际行为很奇怪,是这样的:

  1. 如果所有定位服务都关闭,它永远不会调用onLocationChanged....... 预期行为
  2. 如果只开启wifi/移动网络定位服务,则永远不会调用onLocationChanged....... 意外行为
  3. 如果只开启GPS定位服务,它永远不会调用onLocationChanged(即使我们之后开启wifi定位服务).......意外行为
  4. 如果 GPS 定位服务打开(在打开第一个 wifi/移动定位服务后),它会调用onLocationChanged(并且即使在我们关闭 GPS 之后也会继续调用).......预期行为李>
  5. 如果开启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 = 5000and FASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS = 1000) 在问题中的第 4 种情况下它可以完美运行。
  • 我刚刚浪费了大约 2 天的生命。感谢cmets。现在的问题是我们如何编写高质量的基于位置的应用程序? Google 对其进行排序

标签: android google-play-services locationmanager


【解决方案1】:

就我而言,问题在于聆听。 如果我在获得位置和 gps 权限之前启动了 GoogleApi 服务,那么 OnLocationChanged 永远不会调用。所以 在 OnPermissionGrantedResult 和 android.location.PROVIDERS_CHANGED 的接收器中,我正在重新启动 GoogleApiServices 并开始接收位置事件

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 2016-11-14
    • 2012-08-30
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多