9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ヘルスケアAdvent Calendar 2018

Day 21

Google Fitへ栄養データ(PFC)を登録する

Last updated at Posted at 2018-11-20

前書き

仕事で開発しているAndroidアプリにて、栄養データをGoogle Fitへ登録する処理を実装したときの足跡です。
2018年11月現在も、Google Fitアプリで確認できる栄養データはPFCデータのみっぽいので、その3つ+カロリーを書き込むことにします。

PFC = プロテイン(Protein) 脂肪(Fat) 炭水化物(Carbs)

Client作成

Google APIに接続するクライアントを作成する際に、History APIの利用とFITNESS_NUTRITION_READ_WRITEをScopeに加えることで、栄養価データの読み書きができるようになります。

// クライアント作成
mClient = new GoogleApiClient.Builder(getApplicationContext())
        .addApi(Fitness.HISTORY_API)
        .addScope(new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE))
        .addConnectionCallbacks(
                new GoogleApiClient.ConnectionCallbacks() {
                    @Override
                    public void onConnected(Bundle bundle) {
                        Timber.d("Connect OK");
                        startFitnessCooper();
                    }

                    @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) {
                            Timber.i("Connection lost.  Cause: Network Lost");
                        } else if (i
                                == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                            Timber.i("Connection lost.  Reason: Service Disconnected");
                        }
                        cleanFitnessClient();
                    }
                }
        )
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(ConnectionResult result) {
                Timber.i("Google Play services connection failed. Cause: " + result.toString());
                cleanFitnessClient();
            }
        })
        .build();

// 接続
mClient.connect();

PFC書き込み

予めPFCデータを用意しておき、非同期で書き込みする。
ここではNutritionEntityに栄養データが格納されていると仮定。
なお、登録データには何かしらの名前をつけてあげる必要があるため、とりあえず年月日(ymd)を使います。

private class InsertAndVerifyDataTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        // 栄養価をGoogleへ書き込む
        updateFitnessDataNutrition(mYmd, mRecordNutritionValueEntity);
        return null;
    }
}

private void updateFitnessDataNutrition(String ymd, NutritionEntity entity) {
    DataSource dataSource = new DataSource.Builder()
            .setAppPackageName(getPackageName())
            .setDataType(DataType.TYPE_NUTRITION)
            .setName(ymd)
            .setType(DataSource.TYPE_RAW)
            .build();

    DataPoint dataPoint = DataPoint.create(dataSource);
    dataPoint.setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);
    dataPoint.getValue(Field.FIELD_FOOD_ITEM).setString("Asken Diet"); // アプリ名などを記載しておくとgoogle fitアプリでデータ元みたいに表示される

    float calorie = entity.values.calorie.val;
    float protein = entity.values.protein.val;
    float fat = entity.values.fat.val;
    float carbs = entity.values.carbohydrate.val;

    // 摂取カロリー (kcal)
    dataPoint.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_CALORIES, calorie);
    // タンパク質(g)
    dataPoint.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_PROTEIN, protein);
    // 脂肪(g)
    dataPoint.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_TOTAL_FAT, fat);
    // 炭水化物(g)
    dataPoint.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_TOTAL_CARBS, carbs);
    
    DataSet dataSet = DataSet.create(dataSource);
    dataSet.add(dataPoint);

    DataUpdateRequest request = new DataUpdateRequest.Builder()
            .setDataSet(dataSet)
            .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();

    Status updateStatus = Fitness.HistoryApi.updateData(mClient, request).await(1, TimeUnit.MINUTES);
    if (!updateStatus.isSuccess()) {
        Timber.i("There was a problem inserting the dataset nutrition");
    }
}

なお、手元で開発してみたかぎりでは、必ずカロリーも書き込みてあげないとGoogle Fitアプリがクラッシュします。

##Google Fitアプリで登録データ確認
正常に栄養データ登録が完了すると、Google FitアプリでPFCデータが確認できます。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?