使用FusedLocationAPI在Android中请求位置更新,但不返回

时间:2016-05-23 09:36:08

标签: android android-service google-play-services android-location android-fusedlocation

更新:我收到此错误,就像在这些问题中解释的那样(12),但根据{{ 3}},这只是一个内部日志,不应该对功能产生影响

  

V / GoogleSignatureVerifier:com.google.android.gms签名无效

原始问题:

即使应用程序被杀,我也必须实现与用户位置相关的不同功能。为此,我使用了一项服务。我尝试跟踪用户时遇到问题,因为我似乎在请求位置更新时遇到问题。

这是我服务中最相关的部分:

免责声明:为了阅读起见,代码已经过简化。所有与服务绑定相关的方法以及几个回调都已被删除,因为不是问题的一部分

public class LocationService extends RoboService implements LocationListener {

    private static final String TAG = "LocationService";
    private static final long UPDATE_INTERVAL_IN_MILLISECONDS = TimeUnit.SECONDS.toMillis(5);
    private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = TimeUnit.SECONDS.toMillis(1);
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

    @Override
    public void onCreate() {
        super.onCreate();

        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .build();

            mGoogleApiClient.connect();
        }

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_REDELIVER_INTENT;
    }

    public Location getCurrentLocation() {
        ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
        if (connectionResult.isSuccess()) {
            return LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        }
        return null;
    }

    public void startLocationUpdates() {
        ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
        if (connectionResult.isSuccess()) {
            Log.d(TAG, "startLocationUpdates: Posting request");
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            Log.d(TAG, "startLocationUpdates: Request posted");
        }
    }

    @Override
    public void onLocationChanged(Location newLocation) {
        System.out.println("LocationService.onLocationChanged");
    }
}

我使用mGoogleApiClient.blockingConnect()因为架构限制我无法使用连接回调,但是当我尝试获取当前位置时,我没有遇到任何问题。< / p>

当我致电startLocationUpdates()时,当我请求位置更新时,执行似乎丢失了,而且Log.d(TAG, "startLocationUpdates: Request posted")onLocationChanged(Location newLocation)都没有被调用。

这里是logcat:

05-23 11:42:47.509 13547-13547/com.example.location D/MapPresenterImpl: onRouteAdded: Starting route tracking
05-23 11:42:47.512 13547-13950/com.example.location D/LocationService: startLocationUpdates: Posting request
05-23 11:43:28.115 13547-13557/com.example.location W/art: Suspending all threads took: 7.530ms

我的代码基本上是从this answer复制的。我下载了示例源代码,我让它正常工作。我的代码和示例之间的唯一区别是我在服务中并使用mGoogleApiClient.blockingConnect(),但我不知道这会如何影响这种方式。

有人曾经遇到过这种行为吗?我真的输了,我会提前帮助。

替代方法:

最后,我使用PendingIntent而不是Callback方法解决了这个问题。我仍然很高兴知道为什么会这样,但如果有人遇到这个问题并且不知道如何继续,那么这就是我的解决方法。

启动位置更新的方法:

public void startLocationTracking(long routeId) {
    ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
    if (connectionResult.isSuccess()) {
        Intent intent = new Intent(this, TrackingService.class);
        PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        LocationRequest request = new LocationRequest();
        request.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        request.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, pi);
    }
}

跟踪服务:

public class TrackingService extends IntentService {

    public TrackingService() {
        super("TrackingService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (LocationResult.hasResult(intent)) {
            LocationResult locationResult = LocationResult.extractResult(intent);
            Location location = locationResult.getLastLocation();
            // Do whatever you need with the location
        }
    }
}

使用这种方法我遇到了另一个奇怪的问题。如果你在用于构建PendingIntent的Intent中加入一些额外的东西,当调用TrackingService时,Intent extras中没有任何位置,只有在创建Intent时添加的内容。我的解决方法是使用SharedPreferences传递我需要的id,但我并不真正相信这个补丁。 Android examples中讨论了此问题。

0 个答案:

没有答案