Bu sayfada, ortak yapma senaryosunu desteklemek için Co-Doing API'nin nasıl kullanılacağı açıklanmaktadır.
İlk kurulum
Kitaplığı kullanıma hazırlamak için canlı paylaşım uygulamasının ortak çalışma oturumunu temsil eden bir CoDoingClient
nesnesini başlatması gerekir.
Meet Canlı Paylaşım SDK'sını kullanmak için AddonClientFactory.getClient
yöntemini çağırın. Bu komut, ortak yapma oturumu için giriş noktası görevi gören bir AddonClient
döndürür.
İstemciyi kullanmak için AddonClient
üzerinden newSessionBuilder
yöntemini çağırarak yeni AddonSession
için derleyiciyi döndürün.
newSessionBuilder
, oturum için eklenti tarafından sağlanan geri çağırmaları işlemek üzere AddonSessionHandler
arayüzünü uygular.
Oturum başlatmak için withCoDoing
yöntemini derleyiciye ekleyin.
Aşağıdaki kod örneğinde, ortak yapılan istemci nesnesinin temel bir başlatılması gösterilmektedir:
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ılan bir kullanıcı, yerel video uygulamasında oynatmayı duraklatırsa canlı paylaşım deneyimindeki tüm katılımcıların da videosunu duraklattığından emin olmanız gerekir.
Bunun için videonun duraklatıldığını gösteren bir CoDoingState
mesajı oluşturun ve Google Meet'e setGlobalState
yöntemini kullanarak diğer tüm katılımcılara video yayınlamasını söyleyin. Paylaşılan genel durum, yeni bir durum ayarlanana kadar mevcut veya yeni tüm katılımcılar için varsayılan durum olur.
Aşağıdaki kod örneğinde, kullanıcıların duraklatma durumunun 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, canlı paylaşım deneyimine katılan diğer tüm Meet örneklerine yayınlanacak şekilde serileştirilmiş videoState
nesnesini tetikler. Diğer katılımcılardan yayın güncellemelerini nasıl alacağınız hakkında ayrıntılı bilgi için Gelen güncellemeleri yönetme bölümüne göz atın.
Aşağıdaki şemada, duraklatma işlemi tetiklendikten sonra gerçekleşen etkinlik sırası açıklanmaktadır:
Videoyu devam ettir
Videoyu duraklatma işlemine benzer şekilde, bir kullanıcı yerel uygulamasında videoyu devam ettirirse Meet'in bu işlemi diğer canlı paylaşım katılımcılarına yayınlaması gerekir.
Gönderen tarafta (videoyu devam ettiren kullanıcı), duraklatma örneğinden tek fark isPaused
durumunun güncellenmesidir.
Aşağıdaki kod örneğinde, duraklatmanın kaldırıldığı durum hakkında kullanıcıların gönderen tarafından nasıl bilgilendirileceği gösterilmektedir:
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);
}
Video ara
Videoyu duraklatma ve videonun duraklatmasını kaldırma gibi, bir kullanıcı yerel uygulamada zaman çizelgesini yeni bir zaman damgasına sürüklerse Meet'in bu işlemi tüm katılımcılara yayınlaması gerekir.
Aşağıdaki kod örneğinde, güncellenen zaman damgasının gönderen tarafından kullanıcılara nasıl bildirileceği gösterilmektedir:
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 oynat
Kullanıcı yerel uygulamada başka bir video seçerek izlenmekte olan videoyu da değiştirirse Meet'in yeni videoyu canlı paylaşıma katılan tüm katılımcılar için oynatması gerekir. Değiştirilen video videoState.videoUrl
içinde depolanır.
Aşağıdaki kod örneğinde, kullanıcılara güncellenen video URL'sini nasıl bildireceğiniz 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 çalışmayı sonlandır
Kullanıcı etkinliği sonlandırmayı seçtiğinde endSession
yönteminin Meet uygulamasıyla bağlantısı kesilir. Bu, Meet'i toplantıyı sonlandırmaya zorlamaz veya kullanıcının toplantıdan ayrılmasına neden olmaz.
Aşağıdaki kod örneğinde, kullanıcıların durdurulan oturum hakkında nasıl bilgilendirileceğ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ı bir yayın aldığında onGlobalStateChanged()
geri çağırma özelliği tetiklenir. Gelen güncellemelere yanıt olarak hangi işlemin yapılacağı konusunda iyi kararlar vermek genellikle oldukça önemlidir. Örneğin, yalnızca yerel zaman damgasından yeterince farklı olan gelen video zaman damgalarını eşleştirmek gibi işlemler yapılmalıdır.
Aşağıdaki kod örneğinde, gelen farklı 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();
}
}
}