सेशन के साथ काम करें

सेशन, उस समयावधि को दिखाता है जिसके दौरान उपयोगकर्ता फ़िटनेस से जुड़ी गतिविधि करते हैं. सेशन एपीआई की मदद से आपका ऐप्लिकेशन, फ़िटनेस स्टोर में सेशन शुरू कर सकता है.

चल रही फ़िटनेस गतिविधियों के लिए, जब उपयोगकर्ता आपके ऐप्लिकेशन को फ़िटनेस से जुड़ी गतिविधि शुरू करने और उसे पूरा करने की सूचना देता है, तब रीयल टाइम में सेशन बनाए जा सकते हैं.

फ़िटनेस से जुड़ी गतिविधि पूरी होने के बाद या 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) टाइप का है. यह खास तौर पर, कसरत के दौरान थोड़ी देर रुकें.

उदाहरण के लिए, अगर आपने Session.Builder.setActivity() तरीके से 30 मिनट का रनिंग सेशन बनाया है, लेकिन उपयोगकर्ता बीच में 10 मिनट का ब्रेक लेता है, तो आपका ऐप्लिकेशन गलत तरीके से दिखाएगा कि उपयोगकर्ता 30 मिनट तक दौड़ रहा है. इसके लिए ज़रूरी है कि आपका ऐप्लिकेशन यह पता लगा सके कि उपयोगकर्ता पैदल चल रहा है या दौड़ रहा है. गतिविधि सेगमेंट के डेटा से आपके ऐप्लिकेशन को यह जानकारी मिलती है कि उपयोगकर्ता ने 10 मिनट तक दौड़कर 10 मिनट तक दौड़ लगाई. इसके बाद, वह 10 मिनट और चला. आपने गतिविधि सेगमेंट का जो डेटा डाला है उसे देखकर दूसरे ऐप्लिकेशन भी गतिविधि को सही तरीके से रिपोर्ट कर सकते हैं.

किसी सेशन में गतिविधि सेगमेंट का डेटा जोड़ने के लिए, एक ऐसा डेटासेट बनाएं जिसमें com.google.activity.segment टाइप के पॉइंट शामिल हों. इनमें से हर पॉइंट एक निरंतर समय का अंतराल दिखाता है, इस दौरान उपयोगकर्ता ने एक ही तरह की गतिविधि की है.

दौड़ने और चलने के पिछले उदाहरण में, गतिविधि के लिए तीन सेगमेंट पॉइंट ज़रूरी होंगे: एक पहले 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();

सेशन का इस्तेमाल करके फ़िटनेस का डेटा पढ़ें

सेशन एपीआई की मदद से, आपको फ़िटनेस स्टोर से उन सेशन की सूची मिलती है जो कुछ शर्तों से मेल खाते हैं. उदाहरण के लिए, आपके पास किसी समय अंतराल में शामिल सभी सेशन की जानकारी पाने या नाम या आईडी से किसी खास सेशन की जानकारी पाने का विकल्प होता है. यह भी बताया जा सकता है कि आपकी दिलचस्पी उन सेशन में है जो आपके ऐप्लिकेशन ने बनाए हैं या किसी ऐप्लिकेशन से बनाए गए हैं.

कुछ शर्तों से मेल खाने वाले सेशन की सूची पाने के लिए, सबसे पहले एक 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));

सेशन का इस्तेमाल करके नींद का डेटा पढ़ें

नींद के सेशन को गतिविधि के अन्य सेशन से अलग माना जाता है. डिफ़ॉल्ट रूप से, रीड रिस्पॉन्स में सिर्फ़ गतिविधि के सेशन होते हैं, नींद के सेशन नहीं.

नींद के सेशन शामिल करने के लिए, अपना SessionReadRequest बनाते समय includeSleepSessions तरीके का इस्तेमाल करें. गतिविधियों और सेशन, दोनों को शामिल करने के लिए, includeSleepSessions और includeActivitySessions, दोनों का इस्तेमाल करें.

अन्य ऐप्लिकेशन के सेशन दिखाएं

उपयोगकर्ताओं को किसी दूसरे ऐप्लिकेशन में किसी सेशन की ज़्यादा जानकारी दिखाने के लिए, आपका ऐप्लिकेशन ऐसे इंटेंट को शुरू कर सकता है जिसमें सेशन की जानकारी हो. आप किसी खास ऐप्लिकेशन के बारे में बता सकते हैं, जैसे कि वह ऐप्लिकेशन जिसने सेशन बनाया है. इसके अलावा, अगर सेशन बनाने वाला ऐप्लिकेशन, डिवाइस पर इंस्टॉल नहीं है, तो उस ऐप्लिकेशन को अनुमति दी जा सकती है जो इंटेंट के हिसाब से फ़िटनेस से जुड़ी गतिविधि दिखा सकता है.

किसी दूसरे ऐप्लिकेशन पर सेशन का डेटा दिखाने के लिए, 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 से आपके ऐप्लिकेशन को मिलने वाले हर इंटेंट में सिर्फ़ एक गतिविधि होती है. हालांकि, एक इंटेंट फ़िल्टर में कई 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());
    }
}