Co-Doing API'sini uygulayın

Bu sayfada, ortak çalışmayı desteklemek için Co-Doing API'nin nasıl kullanılacağı açıklanmaktadır. senaryoyu izler.

İlk kurulum

Kitaplığı kullanıma hazırlamak için canlı paylaşım uygulaması, CoDoingClient nesnesini ifade eder.

Meet canlı paylaşım SDK'sını kullanmak için AddonClientFactory.getClient yöntemidir. Bu, AddonClient giriş noktası işlevi görür.

İstemciyi kullanmak için newSessionBuilder yeni bir sayfa için oluşturucu döndürmek için AddonClient AddonSession. newSessionBuilder, AddonSessionHandler Search Ads 360 kullanıcı arayüzü tarafından sağlanan ekleyeceğiz.

Bir oturum başlatmak için withCoDoing yöntemini derleyin.

Aşağıdaki kod örneğinde, birlikte yapma istemcisinin temel bir ilk kullanıma hazırlanması gösterilmektedir nesne:

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

Videoyu duraklat

Canlı paylaşım deneyimine katıldığınızda kullanıcı oynatmayı duraklatırsa canlı yayındaki tüm katılımcıların, canlı yayın sırasındaki tüm katılımcıların paylaşım deneyiminin bir parçası olarak görüyor.

Bunu yapmak için, projenizin CoDoingState Videonun duraklatıldığını gösteren mesaj ve Google Meet'e videoyu anons etmesini söyle projedeki diğer tüm katılımcılar için setGlobalState yöntemidir. Paylaşılan genel durum, tüm katılımcılar için varsayılan durum olur. mevcut veya yeni olana kadar, yeni bir eyalet belirlenene kadar

Aşağıdaki kod örneğinde, kullanıcılara duraklatılmış durumun nasıl bildirileceği gösterilmektedir:

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);
};

Kod örneği, yayınlanacak serileştirilmiş videoState nesnesini tetikler Meet'in canlı paylaşıma katılan diğer tüm örnekleri sunmaktır. Diğer cihazlardan yayın güncellemelerini nasıl alacağınızla ilgili daha fazla bilgi için Gelen güncellemeleri yönetme bölümüne bakın.

Aşağıdaki şemada, duraklatma işlemi tamamlandıktan sonraki tetiklendi:

Canlı Paylaşım API&#39;si diyagramını başlatın.

Videonun duraklatmasını kaldır

Videoyu duraklatma işlemine benzer şekilde, kullanıcı kendi Meet'in bu işlemi başka bir canlı cihaza yayınlaması gerekir. .

Gönderen tarafında (videoyu devam ettiren kullanıcı), duraklatma örneği, isPaused durumunun güncellenmesidir.

Aşağıdaki kod örneğinde, gönderen tarafı:

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);
}

Videoda ara

Tıpkı videoyu duraklatma ve videoyu devam ettirme gibi Kullanıcı yerel uygulamadaki zaman çizelgesini yeni bir zaman damgasına sürüklediğinde Meet, bu işlemi tüm katılımcılara yayınlamalıdır.

Aşağıdaki kod örneğinde, kullanıcılara güncellenen zaman damgası hakkında nasıl bilgi verileceği gösterilmektedir gönderin:

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);
}

Farklı bir video oynatma

Kullanıcı, başka bir videoyu seçerek izlenmekte olan videoyu da değiştirirse yerel uygulamada, tüm canlı paylaşımlarda Meet'in yeni videoyu oynatması gerekir. katılımcı sayısı. Değiştirilen video videoState.videoUrl içinde depolanır.

Aşağıdaki kod örneğinde, kullanıcılara güncellenen video URL'sinin nasıl bildirileceği gösterilmektedir:

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);
}

Birlikte yapmayı sonlandır

Bir kullanıcı etkinliği sonlandırmayı seçtiğinde endSession yönteminin Meet uygulamasıyla bağlantısı kesilir. Bu, de Meet'in toplantıyı sonlandırmasına izin vermez veya kullanıcının toplantıdan ayrılmasına neden olmaz. bir toplantıdır.

Aşağıdaki kod örneğinde, durdurulan oturumun kullanıcılara nasıl bildirileceği gösterilmektedir:

Java

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

Gelen güncellemeleri yönetme

Başka bir katılımcının Meet uygulaması yayın aldığında onGlobalStateChanged() geri arama tetiklenir. Çoğunlukla, üzerinde çalıştığınız proje ekibinde gelen güncellemelere karşılık olarak yapılacak bir işlem (örneğin, yalnızca gelen video zaman damgaları, yerel zaman damgasından yeterince farklıysa

Aşağıdaki kod örneğinde, farklı gelen güncellemelerin nasıl işleneceği gösterilmektedir:

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