Trang này mô tả cách sử dụng API cùng thực hiện để hỗ trợ việc cùng làm trong trường hợp này.
Thiết lập ban đầu
Để chuẩn bị sử dụng thư viện, ứng dụng chia sẻ trực tiếp phải khởi chạy một
CoDoingClient
đối tượng đại diện cho phiên cùng làm.
Để sử dụng SDK Chia sẻ trực tiếp trên Meet, hãy gọi phương thức
AddonClientFactory.getClient
. Thao tác này sẽ trả về một
AddonClient
đóng vai trò là điểm bắt đầu cho phiên cùng làm.
Để sử dụng ứng dụng, hãy gọi hàm
newSessionBuilder
từ AddonClient
để trả về một trình tạo cho một
AddonSession
.
newSessionBuilder
triển khai
AddonSessionHandler
để xử lý các lệnh gọi lại do
tiện ích bổ sung cho phiên.
Để bắt đầu một phiên, hãy thêm
withCoDoing
vào trình tạo.
Mã mẫu sau đây cho thấy quá trình khởi chạy cơ bản của ứng dụng đồng thực hiện đối tượng:
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 quá trình phát trên ứng dụng video cục bộ, bạn phải đảm bảo tất cả những người tham gia trải nghiệm chia sẻ cũng sẽ tạm dừng video của họ.
Để thực hiện việc này, hãy tạo một
CoDoingState
thông báo cho thấy video đã bị tạm dừng. Hãy yêu cầu Google Meet phát đi thông báo đến video đó
tất cả những người tham gia khác bằng
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 có hoặc mới cho đến khi trạng thái mới được thiết lập.
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 đối tượng videoState
đã chuyển đổi tuần tự sẽ được truyền đến
tất cả các phiên bản khác của Meet tham gia phiên chia sẻ trực tiếp
của bạn. Để biết chi tiết về cách nhận thông tin cập nhật về chương trình phát sóng từ
người tham gia, 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 hành động tạm dừng đã kích hoạt:
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 thì Meet phải truyền trực tiếp thao tác này đến ứng dụng khác chia sẻ người tham gia.
Ở phía người gửi (người dùng tiếp tục video), điểm khác biệt duy nhất là
ví dụ về 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
Cũng giống như tạm dừng video và bỏ 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ộ sang một dấu thời gian mới, Meet phải truyền tin 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 mới 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ộ, Meet phải phát video mới cho tất cả phiên chia sẻ trực tiếp
người tham gia. 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 tính năng cùng thực hiện
Khi người dùng chọn kết thúc hoạt động,
endSession
ngắt kết nối với ứng dụng Meet. Thao tác này không bắt buộc
Meet để kết thúc cuộc họp, đồng thời 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,
onGlobalStateChanged()
lệnh gọi lại được kích hoạt. Thông thường, điều quan trọng là phải đưa ra quyết định sáng suốt về những gì
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ỉ so khớp các tin nhắn đến
dấu thời gian của video nếu chúng đủ khác so với dấu thời gian cục bộ.
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();
}
}
}