ใช้งานเซสชัน

เซสชันจะแสดงช่วงเวลาระหว่างที่ผู้ใช้ ทำกิจกรรมการออกกำลังกาย 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) และเหมาะอย่างยิ่งสำหรับการหยุดชั่วคราวระหว่างการออกกำลังกาย

ตัวอย่างเช่น ถ้าคุณสร้างเซสชันการวิ่ง 30 นาทีด้วยแท็ก Session.Builder.setActivity() แต่ผู้ใช้หยุดพัก 10 นาทีระหว่างนั้น แอปของคุณจะ แสดงอย่างไม่ถูกต้องว่าผู้ใช้วิ่งเป็นเวลา 30 นาที โดยมีเงื่อนไขว่าแอปของคุณสามารถ ดูว่าผู้ใช้กำลังเดินหรือวิ่ง ข้อมูลกลุ่มกิจกรรมจะช่วยให้ แอประบุว่าผู้ใช้วิ่ง 10 นาที เดิน 10 นาที แล้ววิ่ง ต่ออีก 10 นาที แอปอื่นๆ สามารถรายงานกิจกรรมได้อย่างถูกต้อง โดยดูข้อมูลกลุ่มกิจกรรมที่คุณแทรกไว้

หากต้องการเพิ่มข้อมูลกลุ่มกิจกรรมลงในเซสชัน ให้สร้างชุดข้อมูลที่มีจุด ประเภท com.google.activity.segment แต่ละจุดเหล่านี้แสดงถึง ช่วงเวลาต่อเนื่องที่ผู้ใช้ทำกิจกรรมประเภทเดียว

ตัวอย่างการวิ่งและการเดินก่อนหน้านี้จะต้องมีกลุ่มกิจกรรม 3 กลุ่ม คะแนน: หนึ่งคะแนนสำหรับการวิ่งช่วง 10 นาทีแรก หนึ่งคะแนนสำหรับการเดิน ในช่วง 10 นาทีถัดไป และรายการหนึ่งสำหรับวิ่งในช่วง 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 ช่วยให้คุณรับรายการเซสชันจากร้านค้าฟิตเนสที่ ตรงกับเกณฑ์บางอย่าง ตัวอย่างเช่น คุณสามารถดูเซสชันทั้งหมดที่มีอยู่ใน ระยะเวลาหนึ่งๆ หรือดูเซสชันหนึ่งๆ ตามชื่อหรือรหัส คุณสามารถระบุ ไม่ว่าคุณจะสนใจเซสชันที่สร้างโดยแอปของคุณหรือแอปใดก็ตาม

หากต้องการดูรายการเซสชันที่ตรงกับเกณฑ์บางอย่าง ก่อนอื่นให้สร้าง อินสแตนซ์ 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 เพื่อให้มีทั้งกิจกรรมและ ให้ใช้ทั้ง includeSleepSessions และ includeActivitySessions

แสดงเซสชันในแอปอื่นๆ

หากต้องการแสดงมุมมองที่ละเอียดยิ่งขึ้นของเซสชันหนึ่งๆ ในแอปอื่น แอปของคุณสามารถเรียกใช้ Intent ที่มีข้อมูลเซสชันได้ คุณสามารถ ระบุแอปเฉพาะ เช่น แอปที่สร้างเซสชัน หรือในกรณีที่ ไม่ได้ติดตั้งแอปที่สร้างเซสชันไว้ในอุปกรณ์ คุณสามารถอนุญาต แอปที่แสดงกิจกรรมการออกกำลังกายเพื่อตอบสนองต่อความตั้งใจได้

หากต้องการสร้าง Intent ในการแสดงข้อมูลเซสชันในแอปอื่น ให้ใช้ 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 จากแอปอื่นๆ

หากต้องการลงทะเบียนแอปเพื่อรับ Intent จากแอปสุขภาพและความเป็นอยู่ที่ดีอื่นๆ ประกาศตัวกรอง Intent ในไฟล์ Manifest ซึ่งคล้ายกับตัวอย่างต่อไปนี้

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

Intent แต่ละรายการที่แอปได้รับจาก Google Fit มีจุดประสงค์เพียงรายการเดียว กิจกรรม แต่คุณจะกรองเจอประเภท MIME หลายประเภทในตัวกรอง Intent เดียวได้ ตัวกรอง Intent ของแอปต้องมีกิจกรรมทั้งหมดที่แอป รองรับ

จุดประสงค์ในการออกกำลังกายมีดังต่อไปนี้

  • 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());
    }
}