সেশন নিয়ে কাজ করুন

সেশনগুলি একটি সময়ের ব্যবধানের প্রতিনিধিত্ব করে যার সময় ব্যবহারকারীরা একটি ফিটনেস কার্যকলাপ সম্পাদন করে। Sessions API আপনার অ্যাপকে ফিটনেস স্টোরে সেশন তৈরি করতে দেয়।

চলমান ফিটনেস ক্রিয়াকলাপগুলির জন্য যেখানে ব্যবহারকারী ফিটনেস ক্রিয়াকলাপ শুরু এবং শেষ করার সময় আপনার অ্যাপকে অবহিত করে, আপনি রিয়েল টাইমে সেশন তৈরি করতে পারেন৷

আপনি ফিটনেস ক্রিয়াকলাপ শেষ হওয়ার পরে বা যখন আপনি Google ফিটের বাইরে থেকে ডেটা এবং সেশনগুলি আমদানি করেন তখন আপনি ফিটনেস স্টোরে একটি সেশন সন্নিবেশ করতে পারেন৷

রিয়েল টাইমে সেশন তৈরি করুন

চলমান ফিটনেস ক্রিয়াকলাপের জন্য সেশন তৈরি করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

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