import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/talk_status.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart'; import 'package:star_lock/tools/storage.dart'; class UdpTalkRequestHandler extends ScpMessageBaseHandle implements ScpMessageHandler { @override void handleReq(ScpMessage scpMessage) async { // 回复成功 replySuccessMessage(scpMessage); // 判断是否登录账户 final loginData = await Storage.getLoginData(); if (loginData != null && talkStatus.status != TalkStatus.passiveCallWaitingAnswer) { // 收到对讲请求 final TalkReq talkReq = scpMessage.Payload; startChartManage.FromPeerId = scpMessage.ToPeerId!; startChartManage.ToPeerId = scpMessage.FromPeerId!; // 处理收到接听请求后的事件 _talkRequestEvent(talkObjectName: talkReq.callerName); } } @override void handleResp(ScpMessage scpMessage) { // 收到对讲请求回复 final GenericResp genericResp = scpMessage.Payload; if (checkGenericRespSuccess(genericResp)) { // 收到对讲请求的应答 startChartManage.FromPeerId = scpMessage.ToPeerId!; startChartManage.ToPeerId = scpMessage.FromPeerId!; // 发送预期数据 startChartManage.startTalkExpectTimer(); // 停止发送对讲请求 startChartManage.stopCallRequestMessageTimer(); } } @override void handleInvalidReq(ScpMessage scpMessage) {} @override void handleRealTimeData(ScpMessage scpMessage) {} // 来电事件的处理 void _talkRequestEvent({required String talkObjectName}) { // 发送预期数据、通知锁板需要获取视频数据 _handleSendExpect(); // 播放铃声 playRingtone(); // 显示状态栏弹窗 _showTalkRequestNotification(talkObjectName: talkObjectName); // 设置为等待接听状态 talkStatus.setPassiveCallWaitingAnswer(); // 启动对讲请求超时定时器 talkeRequestOverTimeTimerManager.start(); // 收到呼叫请求,跳转到接听页面 Get.toNamed( Routers.starChartTalkView, ); } // 收到来电请求时进行本地通知 Future _showTalkRequestNotification( {required String talkObjectName}) async { const AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails('1', 'flutter_channel', importance: Importance.max, priority: Priority.high, playSound: true, ticker: 'ticker'); const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics); // 获取锁名 // String? getLockName = await Storage.getString(saveLockAlias); final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 执行本地通知 await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr, '${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}。', platformChannelSpecifics, payload: 'item x'); } @override deserializePayload( {required int payloadType, required int messageType, required List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) { if (messageType == MessageTypeConstant.Resp) { final GenericResp genericResp = GenericResp(); genericResp.mergeFromBuffer(byte); return genericResp; } else if (messageType == MessageTypeConstant.Req) { final TalkReq talkReq = TalkReq(); talkReq.mergeFromBuffer(byte); return talkReq; } else { String payload = utf8.decode(byte); return payload; } } void _handleSendExpect() { // 修改预期数据并启动发送预期数据定时器,在收到回复时停止 startChartManage.sendOnlyImageVideoTalkExpectData(); } }