セッションを操作する

セッションは、ユーザーが フィットネス アクティビティを行います。Sessions API を使用すると、アプリは フィットネスストアで

進行中のフィットネス アクティビティ(開始時にユーザーがアプリに通知する)の場合 フィットネス アクティビティを終了すると、リアルタイムでセッションを作成できます。

フィットネス アクティビティの後に、フィットネス ストアにセッションを挿入することもできます。 Google Fit の外部からデータやセッションをインポートしたときに、終了または終了する場合があります。

リアルタイムでセッションを作成する

進行中のフィットネス アクティビティのセッションを作成する手順は次のとおりです。

  1. フィットネス データを定期購入する RecordingClient.subscribe を使用する メソッドを呼び出します。

  2. セッションを開始 SessionsClient.startSession メソッド。

  3. 次のコマンドを使用してセッションを停止します。 SessionsClient.stopSession メソッド。

  4. フィットネス データの登録を解除する 使用する必要がなくなったら RecordingClient.unsubscribe メソッドを呼び出します。

セッションを開始する

アプリでセッションを開始するには、SessionsClient.startSession メソッドを使用します。

Kotlin

// 1. Subscribe to fitness data
// 2. Create a session object
// (provide a name, identifier, description, activity and start time)
val session = Session.Builder()
    .setName(sessionName)
    .setIdentifier("UniqueIdentifierHere")
    .setDescription("Morning run")
    .setActivity(FitnessActivities.RUNNING)
    .setStartTime(startTime, TimeUnit.MILLISECONDS)
    .build()

// 3. Use the Sessions client to start a session:
Fitness.getSessionsClient(this, googleSigninAccount)
    .startSession(session)
    .addOnSuccessListener {
        Log.i(TAG, "Session started successfully!")
    }
    .addOnFailureListener { e ->
        Log.w(TAG, "There was an error starting the session", e)
    }

Java

// 1. Subscribe to fitness data
// 2. Create a session object
// (provide a name, identifier, description, activity and start time)
Session session = new Session.Builder()
        .setName(sessionName)
        .setIdentifier("UniqueIdentifierHere")
        .setDescription("Morning run")
        .setActivity(FitnessActivities.RUNNING)
        .setStartTime(startTime, TimeUnit.MILLISECONDS)
        .build();

// 3. Use the Sessions client to start a session:
Fitness.getSessionsClient(this, googleSigninAccount)
        .startSession(session)
        .addOnSuccessListener(unused ->
                Log.i(TAG, "Session started successfully!"))
        .addOnFailureListener(e ->
                Log.w(TAG, "There was an error starting the session", e));

セッションを停止する

アプリ内のセッションを停止するには、SessionsClient.stopSession メソッドを使用します。

Kotlin

// Invoke the SessionsClient with the session identifier
Fitness.getSessionsClient(this, googleSigninAccount)
    .stopSession(session.getIdentifier())
    .addOnSuccessListener {
        Log.i(TAG, "Session stopped successfully!")

        // Now unsubscribe from the fitness data (see
        // Recording Fitness data)
    }
    .addOnFailureListener { e ->
        Log.w(TAG, "There was an error stopping the session", e)
    }

Java

// Invoke the SessionsClient with the session identifier
Fitness.getSessionsClient(this, googleSigninAccount)
        .stopSession(session.getIdentifier())
        .addOnSuccessListener (unused -> {
            Log.i(TAG, "Session stopped successfully!");
            // Now unsubscribe from the fitness data (see
            // Recording Fitness data)
        })
        .addOnFailureListener(e ->
                Log.w(TAG, "There was an error stopping the session", e));

結果のセッションには次のパラメータがあります。

  • 開始時間: アプリが SessionsClient.startSession を呼び出した時間 メソッドを呼び出します。

  • 終了時間: アプリが SessionsClient.stopSession を呼び出した時間 メソッドを呼び出します。

  • 名前: 渡す Session オブジェクト内の名前 SessionsClient.startSession

フィットネス ストアにセッションを挿入する

以前に収集したデータを含むセッションを挿入するには、次の操作を行います。

  1. 時間間隔とその他の必要な時間を指定する Session オブジェクトを作成する 情報です。

  2. 作成: SessionInsertRequest 関連付けられます。

  3. 必要に応じて、データセットを追加し、データポイントを集計します。

  4. SessionsClient.insertSession メソッドを呼び出します。

セッションを挿入する

セッション メタデータを含むフィットネス データをユーザーのフィットネスに挿入するため まず、SessionInsertRequest インスタンスを作成します。

Kotlin

// Create a session with metadata about the activity.
val session = Session.Builder()
    .setName(SAMPLE_SESSION_NAME)
    .setIdentifier("UniqueIdentifierHere")
    .setDescription("Long run around Shoreline Park")

    .setActivity(FitnessActivities.RUNNING)
    .setStartTime(startTime, TimeUnit.MILLISECONDS)
    .setEndTime(endTime, TimeUnit.MILLISECONDS)
    .build()

// Build a session insert request
val insertRequest = SessionInsertRequest.Builder()
    .setSession(session)
    // Optionally add DataSets for this session.
    .addDataSet(dataset)
    .build()

Java

// Create a session with metadata about the activity.
Session session = new Session.Builder()
        .setName(SAMPLE_SESSION_NAME)
        .setIdentifier("UniqueIdentifierHere")
        .setDescription("Long run around Shoreline Park")

        .setActivity(FitnessActivities.RUNNING)
        .setStartTime(startTime, TimeUnit.MILLISECONDS)
        .setEndTime(endTime, TimeUnit.MILLISECONDS)
        .build();

// Build a session insert request
SessionInsertRequest insertRequest = new SessionInsertRequest.Builder()
        .setSession(session)
        // Optionally add DataSets for this session.
        .addDataSet(dataset)
        .build();

SessionInsertRequest クラスには、データを挿入するための便利なメソッドが用意されています。 同じ通話でセッションを作成して SessionsClient.insertSession。データセットがある場合、 は HistoryClient.insertData メソッドが使用され、次にセッションが作成されます。

Kotlin

Fitness.getSessionsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
    .insertSession(insertRequest)
    .addOnSuccessListener {
        Log.i(TAG, "Session insert was successful!")
    }
    .addOnFailureListener { e ->
        Log.w(TAG, "There was a problem inserting the session: ", e)
    }

Java

Fitness.getSessionsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
        .insertSession(insertRequest)
        .addOnSuccessListener (unused ->
                Log.i(TAG, "Session insert was successful!"))
        .addOnFailureListener(e ->
        Log.w(TAG, "There was a problem inserting the session: ", e));

アクティビティ セグメントを挿入する

Google Fit のアクティビティ セグメント データは、フィットネス アクティビティを示す 一定期間におけるユーザーの行動を把握できます。アクティビティ セグメント データは com.google.activity.segment 型 (TYPE_ACTIVITY_SEGMENT) 特にワークアウト中の一時停止などに便利です

たとえば、Cloud Shell で 30 分のランニング セッションを Session.Builder.setActivity() ユーザーが 10 分の休憩を取ると、アプリは ユーザーが 30 分間実行したことを誤って表示しているとします。ただし、アプリが アクティビティ セグメント データを使用すると、 アプリは、ユーザーが 10 分間走り、10 分間歩いた後、 さらに 10 分間待ちます。他のアプリもアクティビティを正しく報告できます 挿入されたアクティビティセグメントのデータを基に セグメントが決定されます

アクティビティ セグメント データをセッションに追加するには、ポイントを含むデータセットを作成します com.google.activity.segment 型。これらの各ポイントは、 ユーザーが 1 つのアクティビティ タイプを実行した連続時間間隔。

前述のランニングとウォーキングの例では、3 つのアクティビティ セグメントが必要です。 ポイントは、最初の 10 分間のランニング、もう 1 つはウォーキング もう 1 つは残りの 10 分間のランニング用です。

Kotlin

// Create a DataSet of ActivitySegments to indicate the runner walked for
// 10 minutes in the middle of a run.
val activitySegmentDataSource = DataSource.Builder()
    .setAppPackageName(this.packageName)
    .setDataType(DataType.TYPE_ACTIVITY_SEGMENT)
    .setStreamName(SAMPLE_SESSION_NAME + "-activity segments")
    .setType(DataSource.TYPE_RAW)
    .build()

val firstRunningDp = DataPoint.builder(activitySegmentDataSource)
    .setActivityField(Field.FIELD_ACTIVITY, FitnessActivities.RUNNING)
    .setTimeInterval(startTime, startWalkTime, TimeUnit.MILLISECONDS)
    .build()

val walkingDp = DataPoint.builder(activitySegmentDataSource)
    .setActivityField(Field.FIELD_ACTIVITY, FitnessActivities.WALKING)
    .setTimeInterval(startWalkTime, endWalkTime, TimeUnit.MILLISECONDS)
    .build()

val secondRunningDp = DataPoint.builder(activitySegmentDataSource)
    .setActivityField(Field.FIELD_ACTIVITY, FitnessActivities.RUNNING)
    .setTimeInterval(endWalkTime, endTime, TimeUnit.MILLISECONDS)
    .build()

val activitySegments = DataSet.builder(activitySegmentDataSource)
    .addAll(listOf(firstRunningDp, walkingDp, secondRunningDp))
    .build()

// Create a session with metadata about the activity.
val session = Session.Builder()
    .setName(SAMPLE_SESSION_NAME)
    .setDescription("Long run around Shoreline Park")
    .setIdentifier("UniqueIdentifierHere")
    .setActivity(FitnessActivities.RUNNING)
    .setStartTime(startTime, TimeUnit.MILLISECONDS)
    .setEndTime(endTime, TimeUnit.MILLISECONDS)
    .build()

// Build a session insert request
val insertRequest = SessionInsertRequest.Builder()
    .setSession(session)
    .addDataSet(activitySegments)
    .build()

Java

// Create a DataSet of ActivitySegments to indicate the runner walked for
// 10 minutes in the middle of a run.
DataSource activitySegmentDataSource = new DataSource.Builder()
        .setAppPackageName(getPackageName())
        .setDataType(DataType.TYPE_ACTIVITY_SEGMENT)
        .setStreamName(SAMPLE_SESSION_NAME + "-activity segments")
        .setType(DataSource.TYPE_RAW)
        .build();

DataPoint firstRunningDp = DataPoint.builder(activitySegmentDataSource)
        .setActivityField(Field.FIELD_ACTIVITY, FitnessActivities.RUNNING)
        .setTimeInterval(startTime, startWalkTime, TimeUnit.MILLISECONDS)
        .build();

DataPoint walkingDp = DataPoint.builder(activitySegmentDataSource)
        .setActivityField(Field.FIELD_ACTIVITY, FitnessActivities.WALKING)
        .setTimeInterval(startWalkTime, endWalkTime, TimeUnit.MILLISECONDS)
        .build();

DataPoint secondRunningDp = DataPoint.builder(activitySegmentDataSource)
        .setActivityField(Field.FIELD_ACTIVITY, FitnessActivities.RUNNING)
        .setTimeInterval(endWalkTime, endTime, TimeUnit.MILLISECONDS)
        .build();

DataSet activitySegments = DataSet.builder(activitySegmentDataSource)
        .addAll(Arrays.asList(firstRunningDp, walkingDp, secondRunningDp))
        .build();

// Create a session with metadata about the activity.
Session session = new Session.Builder()
        .setName(SAMPLE_SESSION_NAME)
        .setDescription("Long run around Shoreline Park")
        .setIdentifier("UniqueIdentifierHere")
        .setActivity(FitnessActivities.RUNNING)
        .setStartTime(startTime, TimeUnit.MILLISECONDS)
        .setEndTime(endTime, TimeUnit.MILLISECONDS)
        .build();

// Build a session insert request
SessionInsertRequest insertRequest = new SessionInsertRequest.Builder()
        .setSession(session)
        .addDataSet(activitySegments)
        .build();

セッションを使用してフィットネス データを読み取る

Sessions API を使用すると、フィットネス ストアから、 一致しますたとえば、ある期間内のすべてのセッションを 特定のセッションを名前や ID で取得したりできます。また、 自分のアプリで作成されたセッションと他のアプリによって作成されたセッションのどちらに興味がある場合でも、同じカテゴリを表示できます。

条件に一致するセッションのリストを取得するには、まず SessionReadRequest インスタンス:

Kotlin

// Use a start time of 1 week ago and an end time of now.
val endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
val startTime = endTime.minusWeeks(1)

// Build a session read request
val readRequest = SessionReadRequest.Builder()
    .setTimeInterval(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
    .read(DataType.TYPE_SPEED)
    .setSessionName(SAMPLE_SESSION_NAME)
    .build()

Java

// Use a start time of 1 week ago and an end time of now.
ZonedDateTime endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
ZonedDateTime startTime = endTime.minusWeeks(1)

// Build a session read request
SessionReadRequest readRequest = new SessionReadRequest.Builder()
        .setTimeInterval(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
        .read(DataType.TYPE_SPEED)
        .setSessionName(SAMPLE_SESSION_NAME)
        .build();

次に、 SessionsClient.readSession メソッド:

Kotlin

Fitness.getSessionsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
    .readSession(readRequest)
    .addOnSuccessListener { response ->
        // Get a list of the sessions that match the criteria to check the result.
        val sessions = response.sessions
        Log.i(TAG, "Number of returned sessions is: ${sessions.size}")
        for (session in sessions) {
            // Process the session
            dumpSession(session)

            // Process the data sets for this session
            val dataSets = response.getDataSet(session)
            for (dataSet in dataSets) {
                // ...
            }
        }
    }
    .addOnFailureListener { e ->
        Log.w(TAG,"Failed to read session", e)
    }

Java

Fitness.getSessionsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
        .readSession(readRequest)
        .addOnSuccessListener(response -> {
            // Get a list of the sessions that match the criteria to check the
            // result.
            List<Session> sessions = response.getSessions();
            Log.i(TAG, "Number of returned sessions is: ${sessions.size}");
            for (Session session : sessions) {
                // Process the session
                dumpSession(session);

                // Process the data sets for this session
                List<DataSet> dataSets = response.getDataSet(session);
                for (DataSet dataSet : dataSets) {
                    // ...
                }
            }
        })
        .addOnFailureListener(e ->
                Log.w(TAG,"Failed to read session", e));

セッションを使用して睡眠データを読み取る

睡眠セッションは、他のアクティビティ セッションとは区別されたものとして扱われます。デフォルトでは 読み取りレスポンスにはアクティビティ セッションのみが含まれ、睡眠セッションは含まれません。

睡眠セッションを含めるには、 includeSleepSessions メソッドを使用して、SessionReadRequest を作成します。アクティビティと includeSleepSessionsincludeActivitySessions

他のアプリのセッションを表示

別のアプリでの特定のセッションの詳細ビューをユーザーに表示するには、 アプリは、セッション情報を含むインテントを呼び出すことができます。Google Chat では セッションを作成したアプリなど、特定のアプリを指定します。または アプリがデバイスにインストールされていない場合、 インテントに応答してフィットネス アクティビティを表示できるアプリです。

別のアプリでセッション データを表示するインテントを作成するには、 SessionsApi.ViewIntentBuilder クラス:

Kotlin

// Pass your activity object to the constructor
val intent = SessionsApi.ViewIntentBuilder(this)
    .setPreferredApplication("com.example.someapp") // optional
    .setSession(session)
    .build()

// Invoke the intent
startActivity(intent)

Java

// Pass your activity object to the constructor
Intent intent = new SessionsApi.ViewIntentBuilder(this)
        .setPreferredApplication("com.example.someapp") // optional
        .setSession(session)
        .build();

// Invoke the intent
startActivity(intent);

他のアプリからインテントを受信する

他の健康&ウェルネス アプリからインテントを受信するようアプリを登録するには: マニフェストで次のようにインテント フィルタを宣言します。

<intent-filter>
    <action android:name="vnd.google.fitness.VIEW"/>
    <data android:mimeType="vnd.google.fitness.session/running"/>
</intent-filter>

アプリが Google Fit から受け取る各インテントは 1 つのみ 1 つのインテント フィルタで複数の MIME タイプをフィルタリングできます。 アプリのインテント フィルタには、アプリが実行するすべてのアクティビティを含める必要があります。 サポートします。

フィットネス インテントには、次のエクストラが含まれます。

  • vnd.google.gms.fitness.start_time
  • vnd.google.gms.fitness.end_time
  • vnd.google.gms.fitness.session

これらのエクストラからデータを取得する手順は次のとおりです。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    val supportedType = Session.getMimeType(FitnessActivities.RUNNING)

    if (Intent.ACTION_VIEW == intent.action && supportedType == intent.type) {
        // Get the intent extras
        val startTime = Fitness.getStartTime(intent, TimeUnit.MILLISECONDS);
        val endTime = Fitness.getEndTime(intent, TimeUnit.MILLISECONDS)
        val session = Session.extract(intent)
    }
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    String supportedType = Session.getMimeType(FitnessActivities.RUNNING);

    if (Intent.ACTION_VIEW.equals(getIntent().getAction()) && supportedType.equals(getIntent().getType())) {
        // Get the intent extras
        long startTime = Fitness.getStartTime(getIntent(), TimeUnit.MILLISECONDS);
        long endTime = Fitness.getEndTime(getIntent(), TimeUnit.MILLISECONDS);
        Session session = Session.extract(getIntent());
    }
}