Oturumlarla çalışma

Oturumlar, kullanıcıların belirli bir süre içinde bir fitness aktivitesi yapmasına olanak tanır. Sessions API, uygulamanızın fitness mağazası.

Kullanıcının başladığında uygulamanızı bilgilendirdiği, devam eden fitness aktiviteleri için bir fitness aktivitesi bittiğinde, gerçek zamanlı olarak oturum oluşturabilirsiniz.

Dilerseniz fitness antrenmanından sonra fitness mağazasına bir oturum da ekleyebilirsiniz. Google Fit dışından veri ve oturum içe aktardığınızda.

Oturumları gerçek zamanlı olarak oluşturun

Devam eden fitness aktivitelerine yönelik oturumlar oluşturmak için aşağıdaki adımları tamamlayın:

  1. Fitness verilerine abone olma RecordingClient.subscribe yöntemidir.

  2. Bir oturum başlatmak için SessionsClient.startSession yöntemini çağırın.

  3. Oturumu durdurmak için SessionsClient.stopSession yöntemini çağırın.

  4. Fitness verileri aboneliğinden çıkma artık kullanmadığınız için RecordingClient.unsubscribe yöntemidir.

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

Sonuçta oluşturulan oturum aşağıdaki parametrelere sahiptir:

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

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

  • Ad: İlettiğiniz Session nesnesindeki ad SessionsClient.startSession.

Fitness mağazasındaki oturumları ekleme

Daha önce topladığınız verilerle oturum eklemek için aşağıdakileri yapın:

  1. Zaman aralığı ve gerekli diğer gereklilikleri belirten bir Session nesnesi oluşturun ekleyebilirsiniz.

  2. Bir metin oluştur: SessionInsertRequest bahsedeceğiz.

  3. Dilerseniz veri kümeleri ve birleştirilmiş veri noktaları ekleyebilirsiniz.

  4. Oturumu SessionsClient.insertSession yöntemidir.

Oturum ekle

Oturum meta verileri içeren fitness verilerini kullanıcının fitness verilerine eklemek için geçmişi için 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ı, veri eklemek için kolaylık yöntemleri sunar fitness geçmişine kaydedilir ve aynı çağrıda SessionsClient.insertSession. Varsa veri kümeleri, CANNOT TRANSLATE HistoryClient.insertData yöntemini çağırın ve 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 hangi fitness aktivitesini gösterir? belirli bir zaman aralığında gerçekleştirilen performanstır. Etkinlik segmenti verileri: com.google.activity.segment türünde (TYPE_ACTIVITY_SEGMENT) ve özellikle antrenman sırasında duraklamaları desteklemek için yararlıdır.

Örneğin, 30 dakikalık bir koşu oturumu Session.Builder.setActivity() yöntem kullanır ancak kullanıcı aralarında 10 dakikalık bir mola verirse uygulamanız Hatalı bir şekilde kullanıcının 30 dakika boyunca çalıştığı anlamına gelir. Uygulamanız, yalnızca olup olmadığını tespit ederseniz, aktivite segmenti verileri, uygulamada, kullanıcının 10 dakika, 10 dakika yürüdükten sonra koştuğunu gösteriyor ve 10 dakika daha. Diğer uygulamalar da etkinliği doğru şekilde raporlayabilir veya eklediğiniz etkinlik segmenti verilerine bakarak.

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

Önceki koşu ve yürüyüş örneğinde üç aktivite segmenti gereklidir. puan: biri ilk 10 dakika koşu için, diğeri yürüyüş için bir sonraki 10 dakika boyunca, diğeri son 10 dakika boyunca çalışır.

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

Seansları kullanarak fitness verilerini okuma

Sessions API, fitness mağazasındaki şu oturumların listesini almanıza olanak tanır: bazı ölçütlerle eşleşiyor. Örneğin, bir hafta içindeki tüm oturumları ve oturum açabilir veya ada ya da kimliğe göre belirli bir oturum alabilirsiniz. Ayrıca aşağıdakileri de belirtebilirsiniz: Böylece, uygulamanız veya başka bir uygulama tarafından oluşturulan oturumlarla ilgilenebilirsiniz.

Bazı kriterlerle eşleşen oturumların listesini almak için önce bir SessionReadRequest örneği:

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

Daha sonra SessionsClient.readSession yöntem:

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

Uyku verilerini seansları kullanarak okuma

Uyku seansları, diğer aktivite oturumlarından farklı şekilde ele alınır. Varsayılan olarak okuma yanıtları yalnızca aktivite seanslarını içerir, uyku seanslarını içermez.

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

Başka uygulamalardaki oturumları göster

Kullanıcılara farklı bir uygulamadaki 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. Şunları yapabilirsiniz: Oturumu oluşturan uygulama gibi belirli bir uygulama belirtin. Ya da oturumu oluşturan uygulama cihazda yüklü değilse, amaca yanıt vermek için fitness aktivitesi gösterebilen bir uygulamadır.

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

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: manifestinizde 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 amaç yalnızca bir etkinliği vardır, ancak tek bir intent filtresinde birden çok MIME türünü filtreleyebilirsiniz. Uygulamanızın intent filtresi, uygulamanızın destekler.

Fitness amaçları aşağıdaki ekstraları içerir:

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

Bu ekstralardan veri almak için aşağıdaki adımları uygulayın:

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