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