Google健身:保存医疗数据

时间:2017-03-16 10:22:08

标签: android google-fit google-fit-sdk

注意

我在StackOverflow上找不到任何类似的问题。在我发现的唯一主题中,他们询问阅读,而不是写作。

问题

我正在整合GoogleFit,但我无法将insert血压数据发送到HistoryApi。我成功登录,但在添加数据时,我总是得到:

Status{statusCode=TIMEOUT, resolution=null}

我尝试将代码放在AsyncTask中并与.await(1, TimeUnit.MINUTES)同步插入但仍然遇到相同的错误。

我还尝试卸载GoogleFit,我可以通过WiFi访问互联网。

如果有帮助,S Health工作正常。

代码

public static void saveBloodPressure(Context context, long timestampMillis, int systolic, int diastolic){

    // Create DataSource
    DataSource bloodPressureSource = new DataSource.Builder()
            .setDataType(HealthDataTypes.TYPE_BLOOD_PRESSURE)
            .setAppPackageName(context)
            .setStreamName(TAG + " - blood pressure")
            .setType(DataSource.TYPE_RAW)
            .build();

    // Create DataPoint with DataSource
    DataPoint bloodPressure = DataPoint.create(bloodPressureSource);
    bloodPressure.setTimestamp(timestampMillis, TimeUnit.MILLISECONDS);
    bloodPressure.getValue(HealthFields.FIELD_BLOOD_PRESSURE_SYSTOLIC).setFloat(systolic);
    bloodPressure.getValue(HealthFields.FIELD_BLOOD_PRESSURE_DIASTOLIC).setFloat(diastolic);

    // Create DataSet
    DataSet dataSet = DataSet.create(bloodPressureSource);
    dataSet.add(bloodPressure);

    // Create Callback to manage Result
    ResultCallback<com.google.android.gms.common.api.Status> callback = new ResultCallback<com.google.android.gms.common.api.Status>() {
        @Override
        public void onResult(@NonNull com.google.android.gms.common.api.Status status) {

            if (status.isSuccess()) {
                Log.v("GoogleFit", "Success: " + status);
            }else{
                Log.v("GoogleFit", "Error: " + status);
            }
        }
    };

    // Execute insert
    Fitness.HistoryApi.insertData(mGoogleApiClient, dataSet)
            .setResultCallback(callback, 1, TimeUnit.MINUTES);
}

如果有人问,我也会在下面进行GoogleApiClient初始化。

GoogleApiClient初始化

public static void initialize(final FragmentActivity activity){

    // Setup Callback listener
    GoogleApiClient.ConnectionCallbacks connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
        @Override
        public void onConnected(Bundle bundle) {
            Log.i(TAG, "Connected! ");
            // Now you can make calls to the Fitness APIs.
            //subscribe();
        }

        @Override
        public void onConnectionSuspended(int i) {
            // If your connection to the sensor gets lost at some point,
            // you'll be able to determine the reason and react to it here.
            if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                Log.i(TAG, "1 Connection lost.  Cause: Network Lost.");
            } else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                Log.i(TAG, "2 Connection lost.  Reason: Service Disconnected");
            }
        }
    };

    // Handle Failed connection
    GoogleApiClient.OnConnectionFailedListener connectionFailed = new GoogleApiClient.OnConnectionFailedListener() {
        @Override
        public void onConnectionFailed(@NonNull ConnectionResult result) {

            Log.i(TAG, "3 Google Play services connection failed. Cause: " + result.toString());

            Toast.makeText(activity, "4 Exception while connecting to Google Play services: " +
                    result.getErrorMessage() + ":" + result.getErrorCode(), Toast.LENGTH_SHORT).show();

        }
    };

    // Create Google Api Client
    mGoogleApiClient = new GoogleApiClient.Builder(activity)
            .addConnectionCallbacks(connectionCallbacks)
            .enableAutoManage(activity, connectionFailed)
            .addScope(new Scope(Scopes.FITNESS_BODY_READ_WRITE))
            .addApi(Fitness.HISTORY_API)
            .build();
}

谢谢!

2 个答案:

答案 0 :(得分:0)

即使看起来连接超时错误,我觉得你错过了什么。

我不确定这是否会有所帮助,但FITNESS_BODY_READ_WRITE范围需要权限。

您在调用Fitness.HistoryApi.insertData之前是否使用Fitness API进行授权?

您要向哪个用户插入数据?

见这里:https://developers.google.com/android/guides/permissions

在这里(授权):https://developers.google.com/android/reference/com/google/android/gms/fitness/Fitness

答案 1 :(得分:0)

按照Insert data

上的指南操作

插入数据

  

要将数据插入到健身历史记录中,请先创建一个DataSet   实例:

// Set a start and end time for our data, using a start time of 1 hour before this moment.
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.HOUR_OF_DAY, -1);
long startTime = cal.getTimeInMillis();

// Create a data source
DataSource dataSource = new DataSource.Builder()
        .setAppPackageName(this)
        .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
        .setStreamName(TAG + " - step count")
        .setType(DataSource.TYPE_RAW)
        .build();

// Create a data set
int stepCountDelta = 950;
DataSet dataSet = DataSet.create(dataSource);
// For each data point, specify a start time, end time, and the data value -- in this case,
// the number of new steps.
DataPoint dataPoint = dataSet.createDataPoint()
        .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);
dataPoint.getValue(Field.FIELD_STEPS).setInt(stepCountDelta);
dataSet.add(dataPoint);
  

创建DataSet实例后,请使用HistoryApi.insertData   方法并同步等待或提供回调方法进行检查   插入的状态。

// Then, invoke the History API to insert the data and await the result, which is // possible here because of the {@link AsyncTask}. Always include a timeout when calling // await() to prevent hanging that can occur from the service being shutdown because // of low memory or other conditions. Log.i(TAG, "Inserting the dataset in the History API."); com.google.android.gms.common.api.Status insertStatus
=
        Fitness.HistoryApi.insertData(mClient, dataSet)
                .await(1, TimeUnit.MINUTES);

// Before querying the data, check to see if the insertion succeeded. if (!insertStatus.isSuccess()) {
    Log.i(TAG, "There was a problem inserting the dataset.");
    return null; }

// At this point, the data has been inserted and can be read. Log.i(TAG, "Data insert was successful!");