# #flutter #firebase-cloud-messaging #phone-call #agora.io
Вопрос:
Я реализовал voip-вызов в своем приложении flutter. Если оба пользователя открывают приложение и присоединяются (канал agora) вручную, все работает нормально. Но, если пользователь A звонит пользователю B, я получаю вызов на мобильный телефон пользователя B с помощью сообщения callkeep и данных fcm. т. Е. в сообщении FCM onBackground я написал код для включения звука и присоединения к каналу. Обе строки выполнены (канал подключен, аудио включено). Но ни один из пользователей не может говорить или слушать других пользователей.
Вот мой код.
Future<void> bgMsgHandler(RemoteMessage message) async {
Map msgData = message.data;
if (msgData['action'] == "Incoming call") {
final callUUID = "call_uuid_1";
// #region answer_call_action
_callKeep.on(CallKeepPerformAnswerCallAction(), (event) async {
print(
'backgroundMessage: CallKeepPerformAnswerCallAction ${event.callUUID}');
Timer(const Duration(seconds: 1), () {
_callKeep.setCurrentCallActive(callUUID);
_callKeep.setMutedCall(callUUID, true);
});
await initAgora();
});
// #endregion
// #region end_call_action
_callKeep.on(CallKeepPerformEndCallAction(),
(CallKeepPerformEndCallAction event) {
print(
'backgroundMessage: CallKeepPerformEndCallAction ${event.callUUID}');
engine.leaveChannel();
});
// #endregion
if (!callKeepInited) {
_callKeep.setup(
null,
<String, dynamic>{
'ios': {
'appName': 'CallKeepDemo',
},
'android': {
'alertTitle': 'Phone Permissions required',
'alertDescription': 'Allow access to speak to our partners',
'cancelButton': 'Cancel',
'okButton': 'Ok',
'foregroundService': {
'channelId': 'com.company.my',
'channelName': 'Foreground service for my app',
'notificationTitle': 'My app is running on background',
'notificationIcon':
'Path to the resource icon of the notification',
},
},
},
backgroundMode: true);
callKeepInited = true;
}
print('backgroundMessage: displayIncomingCall (user B)');
_callKeep.displayIncomingCall(callUUID, 'user_B');
_callKeep.backToForeground();
}
}
В консоли отладки я получаю сообщение, к которому присоединились локальные и удаленные пользователи. Но не удается передать и получить аудио.
Вот моя функция инициализации agora
Future<void> initAgora() async {
engine = await RtcEngine.create(AGORA_APP_ID);
engine.setEventHandler(RtcEngineEventHandler(
joinChannelSuccess: (channel, uid, elapsed) {
print("local user [$uid] joined");
},
userJoined: (uid, elapsed) {
print("remote user [$uid] joined");
remoteUid = uid;
},
userOffline: (uid, reason) {
print("remote user [$uid] left channel $reason");
remoteUid = null;
engine.leaveChannel();
},
));
try {
await engine.enableAudio();
await engine.joinChannel(AGORA_TOKEN, "firstChannel", null, 0);
} catch (e) {
print("error with agora = $e");
}
}
Я не знаю, проблема ли это с agora или callKeep.
Можете ли вы помочь мне решить эту проблему? Любая помощь приветствуется.
Комментарии:
1. Привет, было бы здорово, если бы вы могли обмениваться журналами для того же. Вы также можете связаться с командой Agora на канале разработчиков Agora slack : agoraiodev.slack.com
Ответ №1:
Я раньше не использовал Agora, но я не думаю, что muted должно быть true. _callKeep.setMutedCall(callUUID, true);
Ответ №2:
Из вашего кода похоже, что он предназначен для того, чтобы каждый пользователь не мог говорить или слышать друг друга.
В блоке
Timer(const Duration(seconds: 1), () {
_callKeep.setCurrentCallActive(callUUID);
_callKeep.setMutedCall(callUUID, true);
});
Изменить
_callKeep.setMutedCall(callUUID, true);
Для
_callKeep.setMutedCall(callUUID, false);
Или удалите его полностью.