Mengimplementasikan Co-Doing API

Halaman ini menjelaskan cara menggunakan Co-Doing API untuk mendukung tugas bersama yang lebih besar.

Penyiapan awal

Untuk menyiapkan library yang akan digunakan, aplikasi berbagi live harus melakukan inisialisasi CoDoingClient yang mewakili sesi kerja sama.

Untuk menggunakan SDK Berbagi Live Meet, panggil metode AddonClientFactory.getClient . Ini akan mengembalikan AddonClient yang berfungsi sebagai titik masuk untuk sesi kerja sama.

Untuk menggunakan klien, panggil metode newSessionBuilder dari AddonClient untuk menampilkan builder bagi AddonSession. newSessionBuilder mengimplementasikan AddonSessionHandler untuk menangani callback yang disediakan oleh {i>add-on<i} untuk sesi ini.

Untuk memulai sesi, tambahkan withCoDoing ke builder.

Contoh kode berikut menunjukkan inisialisasi dasar klien yang bekerja bersama :

Java

class AwesomeVideoAddonSessionHandler implements AddonSessionHandler {}

//For sample implementation, see the "Handle incoming updates" section.
class AwesomeVideoCoDoingHandler implements CoDoingHandler {}

public ListenableFuture<AddonSession> initialSetup() {
  AddonClient meetClient = AddonClientFactory.getClient();
  return meetClient
      .newSessionBuilder(
          new AwesomeVideoAddonSessionHandler())
      .withCoDoing(new AwesomeVideoCoDoingHandler())
      .begin();
}

Jeda video

Saat berpartisipasi dalam pengalaman berbagi live, jika pengguna menjeda pemutaran di aplikasi video lokal mereka, maka Anda harus memastikan bahwa semua peserta yang ikut berbagi pengalaman, juga menjeda video mereka.

Untuk melakukan ini, buat CoDoingState pesan yang menunjukkan video dijeda, dan memberi tahu Google Meet untuk menyiarkan ke video tersebut semua peserta lainnya dengan menggunakan setGlobalState . Status global bersama menjadi status default untuk semua peserta, yang sudah ada atau yang baru, hingga status baru ditetapkan.

Contoh kode berikut menunjukkan cara memberi tahu pengguna tentang status dijeda:

Java

public void onVideoPaused(String videoUrl, Instant currentTimestamp) {
  // Create an internal state object to share with other participants. Note: It's
  // good practice to encode all metadata—even seemingly irrelevant data—into
  // ActivityState updates to guard against race conditions and other subtle
  // failures.
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(true)
    .build();

  // Create the CoDoingState object to wrap the internal state
  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  // Use Meet to broadcast internal state update to all other participants
  this.coDoingClient.setGlobalState(coDoingState);
};

Contoh kode memicu objek videoState serial yang akan disiarkan semua instance Meet lainnya yang berpartisipasi dalam berbagi live pengalaman yang lancar bagi developer. Untuk detail tentang cara menerima pembaruan siaran dari peserta, lihat panduan Menangani info terbaru yang masuk bagian.

Diagram berikut menjelaskan urutan peristiwa setelah tindakan jeda dipicu:

Mulai diagram Live Sharing API.

Lanjutkan video

Mirip dengan menjeda video, jika pengguna melanjutkan video di aplikasi lokal, Meet harus menyiarkan operasi ini ke live stream lain membagikan peserta.

Di sisi pengirim (pengguna yang membatalkan jeda video), satu-satunya perbedaan dari contoh jeda adalah status isPaused diperbarui.

Contoh kode berikut menunjukkan cara memberi tahu pengguna tentang status tidak dijeda dari sisi pengirim:

Java

public void onVideoUnpaused(String videoUrl, Instant currentTimestamp) {
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(false)
    .build();

  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  this.coDoingClient.setGlobalState(coDoingState);
}

Cari video

Sama seperti menjeda video dan membatalkan jeda video, jika pengguna menarik linimasa di aplikasi lokal ke stempel waktu yang baru, Meet harus menyiarkan operasi ini ke semua peserta.

Contoh kode berikut menunjukkan cara memberi tahu pengguna tentang stempel waktu yang diperbarui dari sisi pengirim:

Java

public void onVideoSeeked(String videoUrl, Instant currentTimestamp, bool isPaused) {
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(isPaused)
    .build();

  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  this.coDoingClient.setGlobalState(coDoingState);
}

Putar video lain

Jika pengguna juga mengubah video yang sedang ditonton dengan memilih video lain di aplikasi lokal, Meet harus memutar video baru untuk semua berbagi live peserta. Video yang diubah disimpan di videoState.videoUrl.

Contoh kode berikut menunjukkan cara memberi tahu pengguna tentang URL video yang diperbarui:

Java

public void onVideoChanged(String videoUrl, Duration currentTimestamp, bool isPaused) {
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(isPaused)
    .build();

  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  this.coDoingClient.setGlobalState(coDoingState);
}

Akhiri tugas bersama

Ketika pengguna memilih untuk mengakhiri aktivitas, endSession terputus dari aplikasi Meet. Ini tidak memaksa Meet untuk mengakhiri rapat, serta tidak menyebabkan pengguna keluar dari rapat pertemuan.

Contoh kode berikut menunjukkan cara memberi tahu pengguna tentang sesi yang dihentikan:

Java

public void endCoDoing() {
  this.session.endSession();
}

Menangani update yang masuk

Saat aplikasi Meet peserta lain menerima siaran, onGlobalStateChanged() akan dipicu. Biasanya, penting untuk membuat keputusan yang baik tentang apa yang tindakan yang harus diambil sebagai respons terhadap pembaruan yang masuk seperti hanya mencocokkan stempel waktu video jika cukup berbeda dengan stempel waktu lokal.

Contoh kode berikut menunjukkan cara menangani berbagai update masuk:

Java

class AwesomeVideoCoDoingHandler implements CoDoingHandler {
  public void onGlobalStateChanged(CoDoingState update) {
    AwesomeVideoState videoState = SerializationUtils.deserialize(update.state());

    // Handle transition to new video.
    if (!videoState.videoUrl.equals(this.videoPlayer.videoUrl)) {
      this.videoPlayer.loadVideo(videoState.videoUrl);
    }

    // If the timestamp in the arriving update has sufficiently diverged, adjust
    // the local video playout.
    if (videoState.videoTimestamp.minus(this.videoPlayer.videoTimestamp).abs() >
                                        Duration.ofSeconds(2)) {
      this.videoPlayer.seek(videoState.videoTimestamp);
    }

    // Update pause state, if necessary.
    if (!videoState.isPaused && this.videoPlayer.isPaused) {
      this.videoPlayer.unpause();
    } else if (videoState.isPaused && !this.videoPlayer.isPaused) {
      this.videoPlayer.pause();
    }
  }
}