Trang này mô tả cách sử dụng API cùng hành động để hỗ trợ trường hợp cùng làm.
Thiết lập ban đầu
Để chuẩn bị sử dụng thư viện, ứng dụng chia sẻ trực tiếp sẽ khởi chạy đối tượng CoDoingClient
đại diện cho một phiên cùng thực hiện.
Để sử dụng SDK Chia sẻ trực tiếp của Meet, hãy gọi phương thức AddonClientFactory.getClient
. Phương thức này sẽ trả về một AddonClient
đóng vai trò là điểm bắt đầu của phiên cùng thực hiện.
Để sử dụng ứng dụng, hãy gọi phương thức newSessionBuilder
từ AddonClient
để trả về trình tạo cho AddonSession
mới.
newSessionBuilder
triển khai giao diện AddonSessionHandler
để xử lý các lệnh gọi lại mà tiện ích bổ sung cung cấp cho phiên.
Để bắt đầu một phiên, hãy thêm phương thức withCoDoing
vào trình tạo.
Mã mẫu sau đây cho thấy cách khởi chạy cơ bản của đối tượng ứng dụng đồng thực hiện:
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();
}
Tạm dừng video
Khi tham gia trải nghiệm chia sẻ trực tiếp, nếu người dùng tạm dừng việc phát trên ứng dụng video trên máy, thì bạn phải đảm bảo tất cả những người tham gia trải nghiệm chia sẻ trực tiếp cũng tạm dừng video của họ.
Để thực hiện việc này, hãy tạo một thông báo CoDoingState
cho biết video đang tạm dừng và yêu cầu Google Meet phát đi thông báo cho tất cả những người tham gia khác bằng phương thức setGlobalState
. Trạng thái chung được chia sẻ sẽ trở thành trạng thái mặc định cho tất cả những người tham gia,
hiện tại hay mới, cho đến khi một trạng thái mới được đặt.
Mã mẫu sau đây cho biết cách thông báo cho người dùng về trạng thái tạm dừng:
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);
};
Mã mẫu kích hoạt để truyền đối tượng videoState
đã chuyển đổi tuần tự đến tất cả các phiên bản khác của Meet tham gia vào trải nghiệm chia sẻ trực tiếp. Để biết thông tin chi tiết về cách nhận thông tin cập nhật về thông báo truyền tin từ những người tham gia khác, hãy xem phần Xử lý nội dung cập nhật đến.
Sơ đồ dưới đây mô tả trình tự các sự kiện sau khi kích hoạt thao tác tạm dừng:
Tiếp tục xem video
Tương tự như tính năng tạm dừng video, nếu người dùng tiếp tục phát video trên ứng dụng cục bộ, thì Meet phải thông báo về thao tác này cho những người tham gia chia sẻ trực tiếp khác.
Ở phía người gửi (người dùng huỷ tạm dừng video), điểm khác biệt duy nhất so với ví dụ về việc tạm dừng là trạng thái isPaused
được cập nhật.
Mã mẫu sau đây cho biết cách thông báo cho người dùng về trạng thái huỷ tạm dừng từ phía người gửi:
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);
}
Tua video
Tương tự như tính năng tạm dừng video và huỷ tạm dừng video, nếu người dùng kéo dòng thời gian trên ứng dụng cục bộ đến một dấu thời gian mới, thì Meet phải thông báo về thao tác này cho tất cả người tham gia.
Mã mẫu sau đây cho biết cách thông báo cho người dùng về dấu thời gian cập nhật từ phía người gửi:
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);
}
Phát một video khác
Nếu người dùng cũng thay đổi video đang xem bằng cách chọn một video khác trên ứng dụng cục bộ, thì Meet phải phát video mới cho tất cả những người tham gia chia sẻ trực tiếp. Video đã thay đổi sẽ được lưu trữ trong videoState.videoUrl
.
Mã mẫu sau đây cho biết cách thông báo cho người dùng về URL đã cập nhật của video:
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);
}
Kết thúc chế độ cùng thực hiện
Khi người dùng chọn kết thúc hoạt động, phương thức endSession
sẽ ngắt kết nối khỏi ứng dụng Meet. Thao tác này không buộc Meet phải kết thúc cuộc họp cũng như không khiến người dùng rời khỏi cuộc họp.
Mã mẫu sau đây cho biết cách thông báo cho người dùng về phiên bị dừng:
Java
public void endCoDoing() {
this.session.endSession();
}
Xử lý các bản cập nhật đến
Khi ứng dụng Meet của một người tham gia khác nhận được thông báo, lệnh gọi lại onGlobalStateChanged()
sẽ được kích hoạt. Thông thường, quan trọng là phải đưa ra quyết định sáng suốt về hành động cần thực hiện để phản hồi các bản cập nhật sắp tới, chẳng hạn như chỉ khớp dấu thời gian của video đến nếu khác đủ khác với dấu thời gian trên máy.
Mã mẫu sau đây cho biết cách xử lý các bản cập nhật sắp tới:
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();
}
}
}