使用 Agora Flutter 传入的视频/音频呼叫通知

Posted

技术标签:

【中文标题】使用 Agora Flutter 传入的视频/音频呼叫通知【英文标题】:Flutter incoming video/audio call notification using Agora 【发布时间】:2021-11-19 07:31:12 【问题描述】:

我一直在开发一个应用程序,我需要在我的应用程序中实现应用程序音频和视频通话,我已经使用 Agora.io 完成了,但问题是我必须显示来电通知,无论应用程序是否在前景或背景。我已经尝试了很多东西,但我仍然无法配置它。我正在使用agora_rtc_engine 包拨打电话。

任何帮助将不胜感激。

谢谢

我目前正在使用的代码:

调用方法

class CallMethods 
  final callRef = FirebaseFirestore.instance.collection('Calls');

  Stream<DocumentSnapshot> callstream(@required String id) =>
      callRef.doc(id).snapshots();

  Future<bool> makeCall(@required Call call) async 
    try 
      log('Making call');
      call.hasdialed = true;
      Map<String, dynamic> hasDialedMap = call.toMap(call);

      call.hasdialed = false;
      Map<String, dynamic> hasNotDialedMap = call.toMap(call);

      await callRef.doc(call.senderid).set(hasDialedMap);
      await callRef.doc(call.receiverid).set(hasNotDialedMap);

      return true;
     catch (e) 
      print(e);
      return false;
    
  

  Future<bool> endCall(@required Call call) async 
    try 
      log('ending call');
      await callRef.doc(call.senderid).delete();
      await callRef.doc(call.receiverid).delete();

      return true;
     catch (e) 
      print(e);
      return false;
    
  

Call Utils:用于拨打电话

class CallUtils 
  static final CallMethods callmethods = CallMethods();

  static dial(
    BuildContext context, 
    @required User from,
    @required var to,
  ) async 
    Call call = Call(
      senderid: from.id,
      // senderpic: from.avatar.url,
      callername: from.name,
      receiverid: to.id,
      // receiverpic: to.avatar.url,
      receivername: to.name,
      channelid: Random().nextInt(999999).toString(),
    );

    bool callmade = await callmethods.makeCall(call: call);
    call.hasdialed = true;

    if (callmade) 
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => VideoCallScreen(call: call),
        ),
      );
    
  


之后我有一个接听布局,用于包裹所有屏幕以显示来电通知。

代答呼叫布局:

(user.value.id != null)
          ? StreamBuilder<DocumentSnapshot>(
              stream: callmethods.callstream(id: user.value.id),
              builder: (context, snapshot) 
                if (snapshot.hasData && snapshot.data.data() != null) 
                    Call call = Call.fromMap(snapshot.data.data());
                  if (!call.hasdialed) 
                    return PickupScreen(call: call);
                   else 
                    return widget.scaffold;
                  

                 else 
                  return widget.scaffold;
                
              ,
            )
          : widget.scaffold,

【问题讨论】:

你为什么不发布你尝试过的代码? 它尝试了来自已构建应用程序之一的代码。我可以分享那个链接,因为在这里分享整个代码根本不可行 共享所有代码可能根本不可行,但共享相关部分并解释原因可以很容易。 我使用了这个项目的代码:github.com/sidhya3112/MyChatty---Chat-and-Video-Call-App 让我添加一些让我更加烦恼的部分 【参考方案1】:

可以通过 firebase 推送通知和后端 API 服务来完成。

发送方:

一旦进行呼叫,您将发布带有呼叫者和接收者 ID 的后端 api 服务,并且您的后端服务进一步负责向接收者发送带有有效负载的推送通知。

接收方:

当接收者收到推送通知时,您可以将其配置为自动打开您的应用并显示包含所有有效负载信息的屏幕。也许您可以向他显示一个带有接受和拒绝按钮的屏幕,如果他接受,您可以将他连接到 Agora。

检查this 的有效负载配置。

【讨论】:

能否分享一下代码示例? 不幸的是,我不能。您可以查看开放的 github 存储库,但我试图让您了解整个过程将如何工作。 我有想法,但工作不正常。 欢迎分享你对代码的尝试,我会看看能不能帮到你。 我在问题中添加了我的尝试,你可以看看【参考方案2】:

您似乎关注了 CS GUY。 YOUTUBE ,您可以启动后台任务隔离(当应用程序用于地面或在启动时启动,自动启动和后台任务)并使用 System_alert_window 或气泡覆盖以获得最佳实践。(((()我发现你的源代码和用户提供者有一些变化,所以希望获得更新的源代码,请提供***))))))

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 您的答案不清楚,也没有为所要求的问题提供任何解决方案。我关注了 CS 的人,但这并不意味着我必须使用与他相同的代码。我已经根据我的项目范围进行了更改。您能否提出一些有助于解决问题的建议。

以上是关于使用 Agora Flutter 传入的视频/音频呼叫通知的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 Agora 视频通话问题

在 Agora.io 视频通话后 Unity VideoPlayer 音频中断

如何在flutter中实现agora视频通话邀请

Agora.io 音频正常但视频不传输

Flutter 中的 Agora - 在视频聊天中禁用一个人的视频并让另一个人的视频全屏

使用 Agora SDK 进行视频通话时的 Flutter 通知