Oturumlarla çalışma

Oturum sayısı, kullanıcıların fitness aktivitelerini sergiledikleri zaman aralığını temsil eder. Sessions API, uygulamanızın fitness mağazasında oturumlar oluşturmasına olanak tanır.

Kullanıcıların fitness aktivitelerini başlattıktan ve tamamladıklarında uygulamanızı bilgilendirmelerini sağlayan devam eden fitness aktiviteleri için gerçek zamanlı olarak oturum oluşturabilirsiniz.

Fitness aktivitesi tamamlandıktan sonra veya Google Fit'in dışından verileri ve oturumları içe aktardıktan sonra spor salonuna da oturum ekleyebilirsiniz.

Gerçek zamanlı olarak oturum oluşturun

Devam eden fitness aktiviteleri için oturumlar oluşturmak üzere aşağıdaki adımları tamamlayın:

  1. RecordingClient.subscribe yöntemini kullanarak fitness verilerine abone olun.

  2. Kullanıcı fitness etkinliğini başlattığında SessionsClient.startSession yöntemini kullanarak oturum başlatın.

  3. Kullanıcı fitness etkinliğini sonlandırdığında SessionsClient.stopSession yöntemini kullanarak oturumu durdurun.

  4. Artık RecordingClient.unsubscribe yöntemini kullanmak istemediğiniz fitness verilerinin aboneliğinden çıkabilirsiniz.

Oturum başlatma

Uygulamanızda oturum başlatmak için SessionsClient.startSession yöntemini kullanın:

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

Oturumu durdurma

Uygulamanızda bir oturumu durdurmak için SessionsClient.stopSession yöntemini kullanın:

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

Açılan oturumda aşağıdaki parametreler kullanılır:

  • Başlangıç zamanı: Uygulamanızın SessionsClient.startSession yöntemini çağırdığı zaman.

  • Bitiş zamanı: Uygulamanızın SessionsClient.stopSession yöntemini çağırdığı zaman.

  • Ad: SessionsClient.startSession adlı hesaba ilettiğiniz Session nesnesindeki ad.

Antrenmanları spor salonuna ekleme

Daha önce topladığınız verileri içeren oturumlar eklemek için aşağıdakileri yapın:

  1. Bir zaman aralığı ve diğer gerekli bilgileri belirten bir Session nesnesi oluşturun.

  2. Oturumla birlikte bir SessionInsertRequest oluşturun.

  3. İsteğe bağlı olarak, veri kümeleri ekleyin ve veri noktalarını toplayın.

  4. SessionsClient.insertSession yöntemini kullanarak oturumu ekleyin.

Oturum ekleme

Oturum meta verilerini içeren fitness verilerini kullanıcının fitness geçmişine eklemek için öncelikle bir SessionInsertRequest örneği oluşturun:

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 sınıfı, fitness geçmişine veri eklemek ve SessionsClient.insertSession ile aynı çağrıda oturum oluşturmak için kolaylık yöntemleri sağlar. Veri kümeleri varsa önce HistoryClient.insertData yöntemini çağırmışsınız gibi eklenir ve ardından oturum oluşturulur.

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

Etkinlik segmentleri ekle

Google Fit'teki aktivite segmenti verileri, kullanıcıların belirli bir zaman aralığında hangi fitness aktivitelerini sergilediklerini gösterir. Etkinlik segmenti verileri com.google.activity.segment (TYPE_ACTIVITY_SEGMENT) türündedir ve özellikle antrenmanlar sırasında duraklatmaları desteklemek için kullanışlıdır.

Örneğin, Session.Builder.setActivity() yöntemiyle 30 dakikalık bir koşu oturumu oluşturursanız ancak kullanıcı 10 dakikalık bir ara verirse kullanıcı uygulamanız yanlış bir şekilde kullanıcının 30 dakika boyunca çalıştığını gösterir. Uygulamanızın kullanıcının yürüyüp yürümediğini veya koştuğunu algılayabilmesi durumunda, etkinlik segmenti verileri, kullanıcının kullanıcının 10 dakika boyunca çalıştığını, 10 dakika yürüdükten sonra 10 dakika daha çalıştığını gösterir. Diğer uygulamalar da, eklediğiniz etkinlik segmenti verilerine bakarak etkinliği doğru şekilde bildirebilir.

Bir oturuma etkinlik segmenti verileri eklemek için com.google.activity.segment türündeki noktaları içeren bir veri kümesi oluşturun. Bu noktaların her biri, kullanıcının tek bir etkinlik türünü gerçekleştirdiği sürekli bir zaman aralığını temsil eder.

Önceki koşu ve yürüyüş örneği için, biri ilk 10 dakika boyunca koşu, diğeri sonraki 10 dakika boyunca yürüyüş için ve diğeri de son 10 dakika boyunca koşu için olmak üzere üç etkinlik segmenti noktası gerekir.

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

Fitness verilerini oturum kullanarak okuma

Sessions API, spor salonundan bazı ölçütlere uyan oturumların listesini almanızı sağlar. Örneğin, bir zaman aralığında bulunan tüm oturumları veya ada ya da kimliğe göre belirli bir oturumu elde edebilirsiniz. Uygulamanız veya herhangi bir uygulama tarafından oluşturulan oturumlarla ilgilenip ilgilenmediğinizi de belirtebilirsiniz.

Bazı ölçütlerle eşleşen oturumların listesini almak için önce bir SessionReadRequest örneği oluşturun:

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

Ardından SessionsClient.readSession yöntemini kullanın:

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

Oturumları kullanarak uyku verilerini okuma

Uyku oturumları, diğer etkinlik oturumlarından farklı olarak kabul edilir. Okuma yanıtları varsayılan olarak yalnızca etkinlik oturumlarını içerir, uyku oturumlarını içermez.

Uyku seanslarını eklemek için SessionReadRequest derlemenizi oluştururken includeSleepSessions yöntemini kullanın. Hem etkinlikleri hem de oturumları dahil etmek için hem includeSleepSessions hem de includeActivitySessions kullanın.

Oturumları diğer uygulamalarda göster

Farklı bir uygulamadaki kullanıcılara belirli bir oturumun daha ayrıntılı bir görünümünü göstermek için uygulamanız oturum bilgilerini içeren bir intent çağırabilir. Belirli bir uygulamayı (ör. oturumu oluşturan uygulama) belirtebilirsiniz. Alternatif olarak, oturumu oluşturan uygulamanın cihazda yüklü olmaması kaydıyla, fitness aktivitesi gösterebilen tüm uygulamaların amaca yanıt vermesine izin verebilirsiniz.

Oturum verilerini farklı bir uygulamada gösterme amacı oluşturmak için SessionsApi.ViewIntentBuilder sınıfını kullanın:

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

Diğer uygulamalardan intent alma

Uygulamanızı diğer sağlık ve sağlıklı yaşam uygulamalarından niyet almak üzere kaydetmek için manifest dosyanızda aşağıdakine benzer bir intent filtresi bildirin:

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

Uygulamanızın Google Fit'ten aldığı her niyet yalnızca bir etkinlikten ibarettir ancak tek bir intent filtresinde birden fazla MIME türünü filtreleyebilirsiniz. Uygulamanızın intent filtresinin, uygulamanızın desteklediği tüm etkinlikleri içermesi gerekir.

Fitness amaçları aşağıdaki ek özellikleri içerir:

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

Bu ekstralardan aşağıdaki gibi verileri alabilirsiniz:

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