グループ音声通話
グループ音声通話を実装するサンプルコードです。
前提条件
開始する前に、次の作業が必要です。
- PlanetKitを初期化してください。
- 適切なアクセストークンを取得してください。
- グループ通話フローにて、APIを使用するための全般的なプロセスを確認してください。
グループ音声通話実装時の考慮事項
joinConference()
を呼び出した後、返却されたPlanetKitJoinConferenceResult
のreason
プロパティを確認する必要があります。
reason
がPlanetKitStartFailReason.NONE
の場合、成功を意味します。- それ以外は失敗を意味し、
reason
に応じて適切に処理する必要があります。
デバイス権限のリクエスト
Dart permission_handlerパッケージを使って、電話およびマイクの権限をリクエストします。
import 'package:permission_handler/permission_handler.dart';
final status = await [Permission.microphone, Permission.phone, Permission.bluetoothConnect].request();
変数準備
主要プロパティとイベントハンドラーに対する変数を準備します。
PlanetKitConferenceEventHandler
は、グループ通話のステータス変更イベントを処理するのに使用されます。詳しくは、グループ通話フローを参照してください。PlanetKitMyMediaStatusHandler
は、ローカルユーザーのメディアステータス変更イベントを処理するために使用されます。マイクがミュートもしくはミュート解除された場合、またはオーディオの説明が更新された場合など、イベントに基づいてローカルユーザーのUIを更新できます。
final String _myUserId = "test user id";
final String _serviceId = "test service id";
PlanetKitConference? _conference;
List<Peer> _peers = [];
final _eventHandler = PlanetKitConferenceEventHandler(
onConnected: (conference) => print("connected"),
onDisconnected: (conference, reason, source, byRemote) => print("disconnected $reason"),
onPeerListUpdated: _onPeerListUpdated);
final _myMediaStatusHandler = PlanetKitMyMediaStatusHandler(
onMicMute: (status) => print("mic muted"),
onMicUnmute: (status) => print("mic unmuted"),
onAudioDescriptionUpdate: (status, averageVolumeLevel) => print("audio description updated"));
グループ通話参加
グループ通話に参加するには、適切なPlanetKitJoinConferenceParam
と共にPlanetKitManager.instance.joinConference()
を呼び出します。PlanetKitJoinConferenceParam
を作成するには、PlanetKitJoinConferenceParamBuilder()
を使用してください。
Future<bool> joinConference(String roomId, String accessToken) async {
var builder = PlanetKitJoinConferenceParamBuilder()
.setMyUserId(_myUserId)
.setMyServiceId(_serviceId)
.setRoomServiceId(_serviceId)
.setRoomId(roomId)
.setAccessToken(accessToken);
PlanetKitJoinConferenceParam? param;
try {
param = builder.build();
} catch (error) {
print("failed to build join conference param $error");
return false;
}
final result =
await PlanetKitManager.instance.joinConference(param, _eventHandler);
if (result.reason != PlanetKitStartFailReason.none) {
print("join conference result ${result.reason}");
return false;
}
// Store conference instance and set MyMediaStatusHandler.
_conference = result.conference;
_conference?.myMediaStatus.setHandler(_myMediaStatusHandler);
return true;
}
PlanetKitPeerControl
を使用してピア管理
PlanetKitConferenceEventHandler.onPeerListUpdated()
およびPlanetKitPeerControl
を使用してグループ通話に参加したピアを管理します。ピアリストが更新されたら、モニタリングするピアに対するPlanetKitPeerControl
を作成します。
class Peer {
String userId;
bool isMuted;
bool isOnHold;
bool isConnected = true;
int volume = 0;
PlanetKitPeerControl? _control;
Peer({required this.userId, required this.isMuted, required this.isOnHold});
Future<void> register(PlanetKitPeerControl control) async {
_control = control;
final _handler = PlanetKitPeerControlHandler(
onMicMute: (control) => isMuted = true,
onMicUnmute: (control) => isMuted = false,
onHold: (control, reason) => isOnHold = true,
onUnhold: (control) => isOnHold = false,
onAudioDescriptionUpdate: (control, averageVolumeLevel) =>
volume = averageVolumeLevel,
onDisconnect: (control) => isConnected = false,
);
await _control?.register(_handler);
}
Future<void> unregister() async {
await _control?.unregister();
}
}
void _onPeerListUpdated(PlanetKitConference conference, PlanetKitConferencePeerListUpdateParam updateParam) async {
// process added peers
for (var addedPeer in updateParam.addedPeers) {
final isMuted = await addedPeer.isMuted;
final holdStatus = await addedPeer.holdStatus;
final peer = Peer(
userId: addedPeer.userId.userId,
isMuted: isMuted,
isOnHold: holdStatus.isOnHold);
_peers.add(peer);
// create peer control to monitor peer updates
final peerControl = await _conference?.createPeerControl(addedPeer);
if (peerControl == null) {
print(
"fail to create PlanetKitPeerControl for peer: ${addedPeer.userId.userId}");
continue;
}
peer.register(peerControl);
}
// process removed peers
for (var removedPeer in updateParam.removedPeers) {
try {
final removed = _peers.firstWhere((item) => item.userId == removedPeer.userId.userId);
removed.unregister();
} catch (e) {
print("failed to remove peer: ${removedPeer.userId.userId}");
}
}
}
グループ通話退出
グループ通話から退出するには、leaveConference()
を呼び出します。
Future<bool> leaveConference() async {
return await _conference?.leaveConference() ?? false;
}
CallKit連携のための追加実装(任意)
この手順は、iOSアプリケーションにのみ適用されます。
CallKitフレームワークを使用する場合、PlanetKitJoinConferenceParam
でcallKitType
をPlanetKitCallKitType.user
に設定する必要があります。
次に、CXProviderDelegate.provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession)
でPlanetKitConference.notifyCallKitAudioActivation()
を呼び出し、PlanetKitでオーディオを有効にする必要があります。