0

我的GoogleApiClient连接成功,并且我@Override public void onDataPoint(DataPoint dataPoint) {…}只被调用一次,然后再也不会。这是Service只有在用户界面中授权 Google Fit 后才开始的(这是另一罐蠕虫)。该服务有另一个GoogleApiClient成功运行并在我指定的时间间隔被调用。

这是我从中看到的logcat

mGoogleFitApiClient connected.
mGoogleFitApiClient listener registered.
mGoogleFitApiClient detected DataPoint: still (100.0% confidence)

然后它再也不会被调用,@Override public void onConnectionSuspended(int i) {…}也不会被调用。

这是我的相关代码Service

private void buildFitnessClient() {
    mGoogleFitApiClient = new GoogleApiClient.Builder(this)
            .useDefaultAccount()
            .addApi(Fitness.SENSORS_API)
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
            .addConnectionCallbacks(
                    new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle bundle) {
                            Log.i(TAG, "mGoogleFitApiClient connected.");
                            setupPhysicalActivityListener();
                        }

                        @Override
                        public void onConnectionSuspended(int i) {
                            if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                                Log.i(TAG, "mGoogleFitApiClient connection lost. Cause: network lost.");
                            } else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                                Log.i(TAG, "mGoogleFitApiClient connection lost. Reason: service disconnected");
                            }
                        }
                    }
            )
            .addOnConnectionFailedListener(
                    new GoogleApiClient.OnConnectionFailedListener() {
                        @Override
                        public void onConnectionFailed(ConnectionResult result) {
                            Log.i(TAG, "mGoogleFitApiClient connection failed. Cause: " + result.toString());
                        }
                    }
            )
            .build();
}

@Override
public void onDataPoint(DataPoint dataPoint) {
    String activityName = "";
    float confidence = 0;
    for (Field field : dataPoint.getDataType().getFields()) {
        if (field.getName().equals("activity")) {
            activityName =  dataPoint.getValue(field).asActivity();
        } else if (field.getName().equals("confidence")) {
            confidence = dataPoint.getValue(field).asFloat();
        }
    }
    lastActivityName = activityName;
    lastActivityConfidence = confidence;
    Log.i(TAG, "mGoogleFitApiClient detected DataPoint: " + activityName + " (" + confidence + "% confidence)");
}

private void setupPhysicalActivityListener() {
    SensorRequest sensorRequest = new SensorRequest.Builder()
            .setDataType(DataType.TYPE_ACTIVITY_SAMPLE)
            .setSamplingRate(15, TimeUnit.SECONDS)
            .setFastestRate(5, TimeUnit.SECONDS)
            .setAccuracyMode(SensorRequest.ACCURACY_MODE_LOW)
            .build();
    Fitness.SensorsApi.add(mGoogleFitApiClient, sensorRequest, this)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        Log.i(TAG, "mGoogleFitApiClient listener registered.");
                    } else {
                        Log.i(TAG, "mGoogleFitApiClient listener not registered.");
                    }
                }
            });
}
4

2 回答 2

0

请求数据类型为

setDataType(DataType.TYPE_ACTIVITY_SAMPLE)

尝试

DataType.TYPE_STEP_COUNT_DELTA or DataType.TYPE_HEART_RATE_BPM

看看你是否得到相同的结果。(只调用一次)

于 2015-05-07T08:08:50.593 回答
0

难道是因为屏幕被锁定了?

于 2015-05-20T02:48:45.810 回答