Flutter通话结束后弹窗通知实现及来电ID关联功能咨询
Flutter 通话相关功能实现方案
1. 通话结束后显示弹窗通知
核心是监听系统通话状态变化,在通话结束时触发Flutter弹窗,实现步骤如下:
- 监听通话状态:Flutter无原生通话状态API,需通过
MethodChannel对接Android/iOS系统能力:- Android:注册
TelephonyManager的PhoneStateListener,监听CALL_STATE_IDLE状态(通话结束后回到空闲状态) - iOS:通过
CallKit的CXCallObserver捕获通话结束事件
- Android:注册
- 传递事件到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通话:在通话初始化时设置默认来电标识,存储本地或通过接口传递
- 系统通话:Android在
- 计算通话时长:监听通话开始(
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
相关产品推荐
相关产品推荐

