[Android]Google Fit API を使って歩数の取得を行う

Google Fitは、Googleが提供しているスマホ・スマートフォン用の健康管理アプリ(プラットフォーム)です。
アプリは、Google Fitと連携することで、ユーザーの健康情報(歩数など)を取得可能です。
Google Fitとアプリを連携する手順は、スタートガイドに書かれています。
主な手順は以下となります。

  1. Googleアカウントを取得する
    (Androidアプリを作っているなら取得済みかと思います。)
  2. GooglePlayサービスを利用する
    AndroidStudioのSDK ManagerをGooglePlayサービスを追加します。
  3. OAuth2.0クライアントIDを取得する
    Google API ConsoleでクライアントIDを取得します。
    ここの手順は、複雑ですので「get an OAuth 2.0 Client ID」を読みながら進める必要があります。
  4. プロジェクトを作成して構成する
    AndroidStudioで開発するアプリのプロジェクトを作成します。
  5. GooglePlayサービスクライアントライブラリを追加する
    アプリの「build.gradle」に以下を追加します。

     implementation 'com.google.android.gms:play-services-fitness:20.0.0'
     implementation 'com.google.android.gms:play-services-auth:19.0.0'



アプリのコード(java)は以下のようになります。 ※Permissionの許可にAndroid-Permissionsを使っています。

以下のようにして、GoogleFitのアクセス権を得ます。

    final int REQUEST_OAUTH_REQUEST_CODE = 1001;
    @Override
    protected void onResume() {
        super.onResume();

        final Activity activity = this;
        //Manifest.permission.ACTIVITY_RECOGNITIONを権限を取得する
        Permissions.check(this/*context*/, Manifest.permission.ACTIVITY_RECOGNITION, null, new PermissionHandler() {
            @Override
            public void onGranted() {
                //取得するデータをセットする
                final FitnessOptions fitnessOptions = FitnessOptions.builder()
                        .addDataType(DataType.TYPE_STEP_COUNT_DELTA)
                        .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
                        .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA)
                        .build();
                //Google Fitのアクセス権を取得する
                if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(activity), fitnessOptions)) {
                    GoogleSignIn.requestPermissions(
                            activity,
                            REQUEST_OAUTH_REQUEST_CODE,
                            GoogleSignIn.getLastSignedInAccount(activity),
                            fitnessOptions
                    );
                } else {
                    //アクセス権がある場合は、データを取得する
                    readData();
                }
            }
        });
    }

データの取得はいかように行います。

    // LogCatにデータを出力する
    private void dumpDataSet(DataSet dataSet) {
        Log.d(TAG, "Data type: " + dataSet.getDataType().getName());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

        Log.d(TAG, "Data point count = " + dataSet.getDataPoints().size());

        for (DataPoint dp : dataSet.getDataPoints()) {
            long dpStart = dp.getStartTime(TimeUnit.MILLISECONDS);
            long dpEnd = dp.getEndTime(TimeUnit.MILLISECONDS);
            Log.v(TAG, String.format("Data point: Type:%s, Start%s, End:%s", dp.getDataType().getName(), dateFormat.format(dpStart), dateFormat.format(dpEnd)));
            for(Field field : dp.getDataType().getFields()) {
                String fieldName = field.getName();
                Log.v(TAG, "Field: " + fieldName + " Value: " + dp.getValue(field));
            }
        }
    }

    private void readData() {
        //取得データの範囲を指定します。
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        long end = calendar.getTimeInMillis();
        calendar.add(Calendar.YEAR, -2);
        long start = calendar.getTimeInMillis();

        //取得リクエストを作成します。
        DataReadRequest request = new DataReadRequest.Builder()
                .setTimeRange(start, end, TimeUnit.MILLISECONDS)
                .read(DataType.TYPE_STEP_COUNT_CUMULATIVE)
                .build();
        //取得要求を行います。
        Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readData(request)
                .addOnSuccessListener(new OnSuccessListener() {
                    @Override
                    public void onSuccess(DataReadResponse dataReadResponse) {
                        Log.v(TAG, "onSuccess : " + dataReadResponse.toString());
                        if (dataReadResponse.getBuckets().size() > 0) {
                            for (Bucket bucket : dataReadResponse.getBuckets()) {
                                List dataSets = bucket.getDataSets();
                                for (DataSet dataSet : dataSets) {
                                    dumpDataSet(dataSet);
                                }
                            }                        }
                        else{
                            for(DataSet dataSet :dataReadResponse.getDataSets()){
                                dumpDataSet(dataSet);
                            }
                        }
                    }
                });
    }

GoogleFitを利用するには、スマートウォッチがあると便利なようです。

0 件のコメント :

コメントを投稿