You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter通话结束后弹窗通知实现及来电ID关联功能咨询

Flutter 通话相关功能实现方案

1. 通话结束后显示弹窗通知

核心是监听系统通话状态变化,在通话结束时触发Flutter弹窗,实现步骤如下:

  • 监听通话状态:Flutter无原生通话状态API,需通过MethodChannel对接Android/iOS系统能力:
    • Android:注册TelephonyManager的PhoneStateListener,监听CALL_STATE_IDLE状态(通话结束后回到空闲状态)
    • iOS:通过CallKit的CXCallObserver捕获通话结束事件
  • 传递事件到Flutter:监听到通话结束时,通过MethodChannel把事件通知Flutter端
  • 展示弹窗:在Flutter端接收事件后,调用原生showDialog展示自定义弹窗,示例代码:
    const MethodChannel _callChannel = MethodChannel('your-app/call-status');
    
    @override
    void initState() {
      super.initState();
      _callChannel.setMethodCallHandler((call) async {
        if (call.method == 'onCallEnded') {
          showDialog(
            context: context,
            builder: (_) => AlertDialog(
              title: const Text('通话结束'),
              content: const Text('您的通话已完成'),
              actions: [TextButton(onPressed: () => Navigator.pop(_), child: const Text('确定'))],
            ),
          );
        }
      });
    }
    

2. 添加默认来电ID并展示通话详情弹窗

需结合通话状态监听、业务数据对接实现,步骤如下:

  • 获取/设置来电ID:
    • 系统通话:Android在CALL_STATE_RINGING时通过TelephonyManager获取incomingNumber;iOS通过CallKit的CXCall对象获取handle字段(来电号码)
    • 自定义VoIP通话:在通话初始化时设置默认来电标识,存储本地或通过接口传递
  • 计算通话时长:监听通话开始(CALL_STATE_OFFHOOK)和结束事件,记录时间戳计算差值,或直接读取系统通话记录的时长字段
  • 获取费用与余额数据:通话结束后,携带来电ID、通话时长调用后端业务接口,获取实时通话费用和账户余额
  • 展示详情弹窗:整合数据到弹窗,示例代码:
    _callChannel.setMethodCallHandler((call) async {
      if (call.method == 'onCallEnded') {
        final args = call.arguments as Map;
        String incomingId = args['incomingId'];
        int durationSec = args['duration'];
        
        // 调用后端接口获取费用和余额
        final apiResponse = await http.post(
          Uri.parse('/api/call/settlement'),
          body: {'incomingId': incomingId, 'duration': durationSec},
        );
        final settlementData = jsonDecode(apiResponse.body);
        
        showDialog(
          context: context,
          builder: (_) => AlertDialog(
            title: const Text('通话详情'),
            content: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text('来电ID: $incomingId'),
                Text('通话时长: ${Duration(seconds: durationSec).toString().split('.').first}'),
                Text('通话费用: ¥${settlementData['cost']}'),
                Text('账户余额: ¥${settlementData['balance']}'),
              ],
            ),
            actions: [TextButton(onPressed: () => Navigator.pop(_), child: const Text('确定'))],
          ),
        );
      }
    });
    

注意事项

  • 权限申请:Android需申请READ_PHONE_STATE、READ_CALL_LOG权限;iOS需开启CallKit相关权限,同时配置网络权限
  • 兼容性处理:不同Android版本的通话状态API存在差异,需做版本适配;iOS需处理后台监听通话状态的逻辑

内容的提问来源于stack exchange,提问作者Rishit Pankhaniya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:28:01