Triển khai API Co-Doing

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:

Bắt đầu sơ đồ API Chia sẻ trực tiếp.

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