本文にスキップする
Version: 6.0

グループ音声通話

グループ音声通話を実装するサンプルコードです。

前提条件

開始する前に、次の作業が必要です。

グループ音声通話実装時の考慮事項

joinConference()を呼び出した後、返却されたPlanetKitConferenceResultreasonプロパティを確認する必要があります。

  • reasonPlanetKitStartFailReason.NONEの場合、成功を意味します。
  • それ以外は失敗を意味し、reasonに応じて適切に処理する必要があります。

権限申請

通話をする前に、次のランタイム権限を取得してください。

  • Manifest.permission.READ_PHONE_STATE
  • Manifest.permission.RECORD_AUDIO
  • Manifest.permission.BLUETOOTH_CONNECTtargetSdkVersion 31以上)

変数の用意

主要プロパティとイベントリスナーに対する変数を用意します。

PlanetKitMyMediaStatusListenerは、ローカルユーザーのメディアステータス変更イベントを処理するのに使用されます。マイクがミュートもしくはミュート解除された場合、またはオーディオの説明が更新された場合など、イベントに基づいてローカルユーザーのUIを更新できます。

val myUserId = "test user id"      // The local user's user ID
val serviceId = "test service id" // Service ID

// PlanetKitMyMediaStatusListener object
val myMediaStatusListener = object : PlanetKitMyMediaStatusListener {
override fun onMyAudioMuted() {
// This is called when the local user's audio is muted.
// Write your own code here.
}

override fun onMyAudioUnmuted() {
// This is called when the local user's audio is unmuted.
// Write your own code here.
}

override fun onMyAudioDescriptionUpdated(audioDescription: PlanetKitAudioDescription) {
// This is called when the local user's audio description is updated.
// Write your own code here.
}
}

グループ通話参加

グループ通話に参加するには、適切なPlanetKitConferenceParamと共にPlanetKit.joinConference()を呼び出します。PlanetKitConferenceParamを作成するには、PlanetKitConferenceParam.Builder()を使用してください。

fun joinConferenceExample(roomId: String, accessToken: String)
{
val param = PlanetKitConferenceParam.Builder()
.myId(myUserId)
.roomId(roomId)
.myServiceId(serviceId)
.roomServiceId(serviceId)
.accessToken(accessToken)
.build()

val result = PlanetKit.joinConference(param, conferenceListener = object : ConferenceListener {

override fun onConnected(conference: PlanetKitConference,
isVideoHwCodecEnabled: Boolean,
isVideoShareModeSupported: Boolean) {
// This is called when the call is connected.
// Write your own code here.
}

override fun onDisconnected(conference: PlanetKitConference,
param: PlanetKitDisconnectedParam) {
// This is called when the call is disconnected.
// Write your own code here.
}

override fun onPeerListUpdated(param: PlanetKitConferencePeerListUpdatedParam) {
// This is called when the list of peers is updated.
// The following is an example function. For more information, see the "Manage peers using PlanetKitPeerControl" section.
handlePeerListUpdate(param)
}
})

if (result.reason == PlanetKitStartFailReason.NONE) {
// The "result.conference" instance is the main instance to call APIs from now on.
// You must keep it to control this call.
}
else {
// Handle an error by referring to result.reason.
}
}

ローカルユーザーに対するメディアステータスリスナーの設定(任意)

通話が接続されると、必要に応じてローカルユーザーに対するメディアステータスリスナーを設定します。

fun setMyMediaStatusListenerExample(): Boolean
{
var conference = PlanetKit.getConference() ?: return false

conference.getMyMediaStatus()?.addHandler(myMediaStatusListener, null) {
}

return true
}

各ピアに対するピアコントロールの作成

ピアリストが更新されたら、新たに追加されたピアに対してPlanetKitPeerControlを作成し、PeerControlListenerオブジェクトを登録してください。PeerControlListenerを使用して各ピアのステータス変更を処理できます。

class PeerContainer internal constructor(
peer: PlanetKitConferencePeer
) {
val peerControl: PlanetKitPeerControl = peer.createPeerControl()
?: throw IllegalStateException("Failed to create peer control.")

init {
val peerControlListener = object : PlanetKitPeerControl.PeerControlListener {
override fun onMicMuted(peer: PlanetKitConferencePeer) {
// This is called when the peer's audio is muted.
// Write your own code here.
}

override fun onMicUnmuted(peer: PlanetKitConferencePeer) {
// This is called when the peer's audio is unmuted.
// Write your own code here.
}

override fun onAudioDescriptionUpdated(
peer: PlanetKitConferencePeer,
audioDescription: PlanetKitAudioDescription
) {
// This is called when the peer's audio description is updated.
// Write your own code here. The following is an example of implementation.
val yourOwnThresholdTalkingVolumeLevel = 10
val isPeerTalking =
audioDescription.averageVolumeLevel >= yourOwnThresholdTalkingVolumeLevel
}

override fun onDisconnected(peer: PlanetKitConferencePeer) {
// This is called when the peer is disconnected from the call.
// Write your own code here.
}
}

peerControl.register(peerControlListener)
}
}

// Example function called in the onPeerListUpdated callback.
private val peerContainerList = mutableListOf<PeerContainer>()
fun handlePeerListUpdate(param: PlanetKitConferencePeerListUpdatedParam) {
// Process added peers.
for (addedPeer in param.addedPeers) {
// Create peer control for your class.
peerContainerList.add(PeerContainer(addedPeer))
}

// Process removed peers.
for (removedPeer in param.removedPeers) {
peerContainerList.removeIf {
it.peerControl.peer.isSameMember(removedPeer)
}
}
}

グループ通話退出

グループ通話から退出するには、leaveConference()を呼び出します。

fun leaveConferenceExample(): Boolean
{
var conference = PlanetKit.getConference() ?: return false

conference.leaveConference()

return true
}

関連サンプルコード

関連ドキュメント