为什么我的Fitness.SensorApi OnDataPointListener只调用一次?

时间:2015-05-05 15:28:12

标签: android google-play-services google-api-client google-fit

我的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.");
                    }
                }
            });
}

2 个答案:

答案 0 :(得分:0)

请求数据类型为

setDataType(DataType.TYPE_ACTIVITY_SAMPLE)

尝试

DataType.TYPE_STEP_COUNT_DELTA or DataType.TYPE_HEART_RATE_BPM

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

答案 1 :(得分:0)

可能是因为屏幕被锁定了吗?