Halaman ini menjelaskan cara menggunakan Co-Doing API untuk mendukung skenario kerja bersama.
Penyiapan awal
Untuk menyiapkan library yang akan digunakan, aplikasi berbagi live harus menginisialisasi
objek CoDoingClient
yang mewakili sesi tugas bersama.
Untuk menggunakan SDK Berbagi Live Meet, panggil metode AddonClientFactory.getClient
. Tindakan ini akan menampilkan
AddonClient
yang berfungsi sebagai titik entri untuk sesi tugas bersama.
Untuk menggunakan klien, panggil metode
newSessionBuilder
dari AddonClient
guna menampilkan builder untuk
AddonSession
baru.
newSessionBuilder
mengimplementasikan
antarmuka AddonSessionHandler
untuk menangani callback yang disediakan oleh
add-on untuk sesi tersebut.
Untuk memulai sesi, tambahkan metode
withCoDoing
ke builder.
Contoh kode berikut menunjukkan inisialisasi dasar objek klien tugas 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, Anda harus memastikan semua peserta dalam pengalaman berbagi live juga menjeda video mereka.
Untuk melakukannya, buat pesan
CoDoingState
yang menunjukkan video dijeda, dan beri tahu Google Meet untuk menyiarkan ke
semua peserta lain menggunakan
metode
setGlobalState
. Status global bersama menjadi status default untuk semua peserta, baik yang sudah ada maupun 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 ini memicu objek videoState
serial untuk disiarkan ke
semua instance Meet lain yang berpartisipasi dalam pengalaman berbagi
live. Untuk mengetahui detail tentang cara menerima info terbaru siaran dari peserta
lain, lihat bagian Menangani update yang masuk.
Diagram berikut menjelaskan urutan peristiwa setelah tindakan jeda dipicu:
Lanjutkan video
Serupa dengan menjeda video, jika pengguna melanjutkan video di aplikasi lokal mereka, Meet harus menyiarkan operasi ini ke peserta berbagi live lainnya.
Di sisi pengirim (pengguna yang membatalkan jeda video), satu-satunya perbedaan dari
contoh jeda adalah status isPaused
yang 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 peserta berbagi
live. 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
Saat pengguna memilih untuk mengakhiri aktivitas, metode
endSession
akan terputus dari aplikasi Meet. Tindakan ini tidak memaksa
Meet untuk mengakhiri rapat, juga tidak menyebabkan pengguna keluar dari
rapat.
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, callback
onGlobalStateChanged()
akan dipicu. Biasanya, penting untuk membuat keputusan yang baik tentang
tindakan yang harus diambil sebagai respons terhadap update yang masuk seperti hanya mencocokkan stempel waktu
video yang masuk 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();
}
}
}