با جلسات کار کنید

جلسات بازه زمانی را نشان می دهد که در طی آن کاربران یک فعالیت تناسب اندام را انجام می دهند. Sessions API به برنامه شما اجازه می‌دهد جلساتی را در فروشگاه تناسب اندام ایجاد کند.

برای فعالیت های تناسب اندام مداوم که در آن کاربر هنگام شروع و پایان یک فعالیت تناسب اندام به برنامه شما اطلاع می دهد، می توانید جلسات را در زمان واقعی ایجاد کنید.

همچنین می‌توانید پس از پایان فعالیت تناسب اندام یا زمانی که داده‌ها و جلسات را از خارج از Google Fit وارد می‌کنید، جلسه‌ای را در فروشگاه تناسب اندام وارد کنید.

جلسات را در زمان واقعی ایجاد کنید

برای ایجاد جلسات برای فعالیت های تناسب اندام مداوم، مراحل زیر را تکمیل کنید:

  1. با استفاده از روش RecordingClient.subscribe در داده های تناسب اندام مشترک شوید .

  2. هنگامی که کاربر فعالیت تناسب اندام را آغاز می کند ، یک جلسه را با استفاده از روش SessionsClient.startSession شروع کنید.

  3. هنگامی که کاربر فعالیت تناسب اندام را پایان داد ، جلسه را با استفاده از روش SessionsClient.stopSession متوقف کنید.

  4. با استفاده از روش RecordingClient.unsubscribe ، اشتراک داده‌های تناسب اندام را لغو کنید .

یک جلسه را شروع کنید

برای شروع یک جلسه در برنامه خود، از روش SessionsClient.startSession استفاده کنید:

کاتلین

// 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)
    }

جاوا

// 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 استفاده کنید:

کاتلین

// 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)
    }

جاوا

// 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 ایجاد کنید:

کاتلین

// 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()

جاوا

// 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 را فراخوانی کرده اید و سپس جلسه ایجاد می شود.

کاتلین

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)
    }

جاوا

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 ) است و به‌ویژه برای پشتیبانی از مکث در طول تمرین مفید است.

به عنوان مثال، اگر با متد Session.Builder.setActivity() یک جلسه در حال اجرا 30 دقیقه ای ایجاد کنید اما کاربر در این بین 10 دقیقه استراحت کند، برنامه شما به اشتباه نشان می دهد که کاربر 30 دقیقه اجرا کرده است. به شرط اینکه برنامه شما بتواند تشخیص دهد کاربر در حال راه رفتن یا دویدن است، داده های بخش فعالیت به برنامه شما اجازه می دهد نشان دهد که کاربر 10 دقیقه دویده، 10 دقیقه راه رفته و سپس 10 دقیقه دیگر دویده است. سایر برنامه‌ها نیز می‌توانند با مشاهده داده‌های بخش فعالیتی که درج می‌کنید، فعالیت را به درستی گزارش کنند.

برای افزودن داده های بخش فعالیت به یک جلسه، مجموعه داده ای ایجاد کنید که حاوی نقاطی از نوع com.google.activity.segment باشد. هر یک از این نقاط بازه زمانی پیوسته ای را نشان می دهد که در طی آن کاربر یک نوع فعالیت واحد را انجام می دهد.

مثال قبلی دویدن و پیاده روی به سه نقطه فعالیت نیاز دارد: یکی برای دویدن در 10 دقیقه اول، یکی برای پیاده روی در 10 دقیقه بعدی و دیگری برای دویدن در طول 10 دقیقه پایانی.

کاتلین

// 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()

جاوا

// 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 ایجاد کنید:

کاتلین

// 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()

جاوا

// 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 استفاده کنید:

کاتلین

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)
    }

جاوا

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));

خواندن داده های خواب با استفاده از جلسات

جلسات خواب به عنوان متمایز از سایر جلسات فعالیت در نظر گرفته می شود. به طور پیش‌فرض، پاسخ‌های خواندنی فقط شامل جلسات فعالیت هستند، نه جلسات خواب.

برای گنجاندن جلسات خواب، هنگام ایجاد SessionReadRequest includeSleepSessions کنید. برای گنجاندن هر دو فعالیت و جلسات، از هر دو includeSleepSessions و includeActivitySessions استفاده کنید.

نمایش جلسات در برنامه های دیگر

برای نمایش جزئیات بیشتر به کاربران از یک جلسه خاص در یک برنامه دیگر، برنامه شما می تواند هدفی را فراخوانی کند که حاوی اطلاعات جلسه است. می‌توانید یک برنامه خاص، مانند برنامه‌ای که جلسه را ایجاد کرده است، مشخص کنید. یا اگر برنامه‌ای که جلسه را ایجاد کرده روی دستگاه نصب نشده باشد، می‌توانید به هر برنامه‌ای که می‌تواند فعالیت تناسب اندام را نشان دهد اجازه دهید به هدف پاسخ دهد.

برای ایجاد یک هدف برای نمایش داده های جلسه در یک برنامه دیگر، از کلاس SessionsApi.ViewIntentBuilder استفاده کنید:

کاتلین

// 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)

جاوا

// 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 دریافت می‌کند فقط یک فعالیت است، اما می‌توانید چندین نوع MIME را در یک فیلتر هدف فیلتر کنید. فیلتر قصد برنامه شما باید شامل تمام فعالیت هایی باشد که برنامه شما پشتیبانی می کند.

اهداف تناسب اندام شامل موارد اضافی زیر است:

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

شما می توانید داده های این موارد اضافی را به صورت زیر بدست آورید:

کاتلین

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)
    }
}

جاوا

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