1,监视状态下新增音频数据
2,完善录像时段页面
This commit is contained in:
parent
9231f3cef6
commit
3a1fb84381
@ -49,14 +49,21 @@ class _CatEyeCustomModePageState extends State<CatEyeCustomModePage> {
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
_buildSubTitleItem(
|
||||
'人体侦测距离', '有人出现在门前1.5米范围时启动录像', state.detectionRange.value, () {
|
||||
_openBottomItemSheet(state.detectionRangeList.value, 1);
|
||||
}),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
Obx(() => _buildSubTitleItem(
|
||||
'人体侦测距离', '有人出现在门前1.5米范围时启动录像', state.detectionRange.value,
|
||||
() {
|
||||
_openBottomItemSheet(state.detectionRangeList.value, 1);
|
||||
})),
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
)),
|
||||
),
|
||||
CommonItem(
|
||||
leftTitel: '实时画面',
|
||||
rightTitle: "全天",
|
||||
isHaveLine: false,
|
||||
isHaveDirection: true,
|
||||
isHaveRightWidget: false,
|
||||
)
|
||||
],
|
||||
));
|
||||
}
|
||||
@ -135,6 +142,10 @@ class _CatEyeCustomModePageState extends State<CatEyeCustomModePage> {
|
||||
if (clickIndex == 0) {
|
||||
//感应距离
|
||||
state.showsUpVideo.value = state.showsUpVideoList.value[value];
|
||||
} else if (clickIndex == 1) {
|
||||
//录像时长
|
||||
state.detectionRange.value =
|
||||
state.detectionRangeList.value[value];
|
||||
}
|
||||
|
||||
setState(() {});
|
||||
|
||||
@ -37,7 +37,7 @@ class _VideoSlotPageState extends State<VideoSlotPage> {
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
_buildTipsView('自定义时间', '', 1, boolList[1]),
|
||||
_buildCustomTimeView('自定义时间', '', 1),
|
||||
],
|
||||
));
|
||||
}
|
||||
@ -49,9 +49,7 @@ class _VideoSlotPageState extends State<VideoSlotPage> {
|
||||
width: ScreenUtil().screenWidth - 40.w,
|
||||
margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h),
|
||||
decoration: BoxDecoration(
|
||||
color: isClick
|
||||
? AppColors.blueViewBgColor
|
||||
: AppColors.greyBackgroundColor,
|
||||
color: AppColors.greyBackgroundColor,
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Padding(
|
||||
@ -59,19 +57,13 @@ class _VideoSlotPageState extends State<VideoSlotPage> {
|
||||
left: 20.w, top: 30.h, bottom: 30.h, right: 20.w),
|
||||
child: Row(
|
||||
children: [
|
||||
isClick
|
||||
? Image.asset(
|
||||
'images/mine/icon_mine_blueSelect.png',
|
||||
width: 20.w,
|
||||
height: 14.w,
|
||||
)
|
||||
: SizedBox(
|
||||
width: 20.w,
|
||||
height: 14.w,
|
||||
),
|
||||
SizedBox(
|
||||
width: 20.w,
|
||||
height: 14.w,
|
||||
),
|
||||
SizedBox(width: 10.w),
|
||||
Expanded(
|
||||
child: _buildRichText(titleStr, subTitle, isClick),
|
||||
child: _buildRichText(titleStr, subTitle, false),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
@ -93,6 +85,91 @@ class _VideoSlotPageState extends State<VideoSlotPage> {
|
||||
);
|
||||
}
|
||||
|
||||
//自定义时间
|
||||
Widget _buildCustomTimeView(String leftStr, String rightStr, int isEndTIme) {
|
||||
return GestureDetector(
|
||||
child: Container(
|
||||
width: ScreenUtil().screenWidth - 40.w,
|
||||
margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColors.blueViewBgColor,
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: 20.w, top: 30.h, bottom: 30.h, right: 20.w),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'images/mine/icon_mine_blueSelect.png',
|
||||
width: 20.w,
|
||||
height: 14.w,
|
||||
),
|
||||
SizedBox(width: 10.w),
|
||||
Expanded(
|
||||
child: _buildRichText('自定义时间', '', true),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
Container(
|
||||
height: 1,
|
||||
margin: EdgeInsets.only(
|
||||
left: 20.w, right: 20.w, top: 20.h, bottom: 20.h),
|
||||
color: AppColors.blueTextTipsColor,
|
||||
),
|
||||
startAndEndTimeRow(false),
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
startAndEndTimeRow(true),
|
||||
],
|
||||
)),
|
||||
),
|
||||
onTap: () {},
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
Widget startAndEndTimeRow(bool isEndTime) {
|
||||
return GestureDetector(
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 20.w,
|
||||
),
|
||||
Text(
|
||||
isEndTime == false ? '开始时间' : '结束时间',
|
||||
style:
|
||||
TextStyle(color: AppColors.blueTextTipsColor, fontSize: 22.sp),
|
||||
),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
width: 20.w,
|
||||
)),
|
||||
Text(
|
||||
isEndTime == false ? '当日22:00' : '次日08:00',
|
||||
style:
|
||||
TextStyle(color: AppColors.blueTextTipsColor, fontSize: 22.sp),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
Image.asset(
|
||||
'images/icon_right_grey.png',
|
||||
width: 12.w,
|
||||
height: 21.w,
|
||||
)
|
||||
],
|
||||
),
|
||||
onTap: () {},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildRichText(String titleStr, String subTitle, bool isClick) {
|
||||
//高亮样式
|
||||
final TextStyle titleStyle = TextStyle(
|
||||
|
||||
@ -279,8 +279,8 @@ class LockMonitoringLogic extends BaseGetXController {
|
||||
topBytes[6] = (state.udpSendDataFrameNumber & 0x000000FF);
|
||||
topBytes[7] = ((state.udpSendDataFrameNumber & 0x0000FF00) >> 8);
|
||||
|
||||
print(
|
||||
"udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}");
|
||||
// print(
|
||||
// "udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}");
|
||||
topBytes.addAll(bytes);
|
||||
Get.log("setVoiceBytes:$topBytes");
|
||||
|
||||
|
||||
@ -41,51 +41,11 @@ class RealTimePictureLogic extends BaseGetXController {
|
||||
StreamSubscription? _getUDPStatusRefreshUIEvent;
|
||||
void _getUDPStatusRefreshUIAction() {
|
||||
_getUDPStatusRefreshUIEvent =
|
||||
eventBus.on<GetUDPStatusRefreshUI>().listen((event) {
|
||||
eventBus.on<GetUDPStatusMonitorUI>().listen((event) {
|
||||
state.udpStatus.value = event.udpStatus;
|
||||
if (state.udpStatus.value == 8) {
|
||||
// 接听成功了,然后刷新界面的时间 60秒以后自动挂断
|
||||
state.oneMinuteTimeTimer =
|
||||
Timer.periodic(const Duration(seconds: 1), (Timer t) async {
|
||||
state.oneMinuteTime.value++;
|
||||
// Get.log('state.oneMinuteTime.value:${state.oneMinuteTime.value}');
|
||||
if (state.oneMinuteTime.value >= 60) {
|
||||
// 超过60秒了
|
||||
state.oneMinuteTimeTimer.cancel();
|
||||
state.oneMinuteTime.value = 0;
|
||||
// 挂断
|
||||
UDPSenderManage.sendMainProtocol(
|
||||
command: 150,
|
||||
commandTypeIsCalling: 1,
|
||||
subCommand: 30,
|
||||
lockID: state.getLockName.value,
|
||||
lockIP: UDPManage().host,
|
||||
userMobile: await state.userMobile,
|
||||
userMobileIP: await state.userMobileIP,
|
||||
endData: []);
|
||||
CallTalk().stopPcmSound();
|
||||
|
||||
// 关闭当前界面
|
||||
Get.back();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//查询监视状态
|
||||
udpQueryMonitoringStatusAction() async {
|
||||
UDPSenderManage.sendMainProtocol(
|
||||
command: 152,
|
||||
commandTypeIsCalling: 1,
|
||||
subCommand: 20,
|
||||
lockID: state.getLockName.value,
|
||||
lockIP: UDPManage().host,
|
||||
userMobile: await state.userMobile,
|
||||
userMobileIP: await state.userMobileIP,
|
||||
endData: []);
|
||||
}
|
||||
|
||||
/// 监视
|
||||
udpMonitorAction() async {
|
||||
UDPSenderManage.sendMainProtocol(
|
||||
@ -100,19 +60,6 @@ class RealTimePictureLogic extends BaseGetXController {
|
||||
// print('得到lockName------${state.getLockName.value}');
|
||||
}
|
||||
|
||||
/// 接听
|
||||
udpAnswerAction() async {
|
||||
UDPSenderManage.sendMainProtocol(
|
||||
command: 150,
|
||||
commandTypeIsCalling: 1,
|
||||
subCommand: 6,
|
||||
lockID: UDPManage().lockId,
|
||||
lockIP: UDPManage().host,
|
||||
userMobile: await state.userMobile,
|
||||
userMobileIP: await state.userMobileIP,
|
||||
endData: []);
|
||||
}
|
||||
|
||||
/// 挂断
|
||||
udpHangUpAction() async {
|
||||
UDPSenderManage.sendMainProtocol(
|
||||
@ -232,67 +179,11 @@ class RealTimePictureLogic extends BaseGetXController {
|
||||
String? lockIP = args["lockIP"];
|
||||
String? userMobile = args["userMobile"];
|
||||
String? userMobileIP = args["userMobileIP"];
|
||||
|
||||
// int length = 320; // 每个子List的长度
|
||||
// List<int> list = state.listAudioData.value.sublist(0, 320);
|
||||
// for (int i = 0; i < bytes.length; i += length) {
|
||||
// int end = (i + length < bytes.length) ? i + length : bytes.length;
|
||||
// bytes.sublist(i, end);
|
||||
// // _sendRecordData(bytes.sublist(i, end));
|
||||
// // // 刚进来是接听状态,然后改为长按对讲
|
||||
// }
|
||||
|
||||
// while(list.isNotEmpty) {
|
||||
state.udpSendDataFrameNumber++;
|
||||
if (state.udpSendDataFrameNumber >= 65536) state.udpSendDataFrameNumber = 1;
|
||||
// 57
|
||||
List<int> topBytes = [];
|
||||
|
||||
// var cID = "XXXCID";
|
||||
// List<int> cIDData = utf8.encode(cID!);
|
||||
// topBytes.addAll(cIDData);
|
||||
// // topBytes = getFixedLengthList(cIDData, 20 - cIDData.length);
|
||||
// for (int i = 0; i < 6 - cIDData.length; i++) {
|
||||
// topBytes.add(0);
|
||||
// }
|
||||
//
|
||||
// // 命令
|
||||
// topBytes.add(150);
|
||||
//
|
||||
// // 命令类型
|
||||
// topBytes.add(1);
|
||||
//
|
||||
// // 子命令
|
||||
// topBytes.add(8);
|
||||
//
|
||||
// // lockID
|
||||
// List<int> lockIDData = utf8.encode(lockID!);
|
||||
// topBytes.addAll(lockIDData);
|
||||
// // topBytes = getFixedLengthList(lockIDData, 20 - lockIDData.length);
|
||||
// for (int i = 0; i < 20 - lockIDData.length; i++) {
|
||||
// topBytes.add(0);
|
||||
// }
|
||||
//
|
||||
// // lockIP
|
||||
// var lockIPList = lockIP!.split(".");
|
||||
// lockIPList.forEach((element) {
|
||||
// topBytes.add(int.parse(element));
|
||||
// });
|
||||
//
|
||||
// // userMobile
|
||||
// List<int> userMobileData = utf8.encode(userMobile!);
|
||||
// topBytes.addAll(userMobileData);
|
||||
// // topBytes = getFixedLengthList(topBytes, 20 - userMobileData.length);
|
||||
// for (int i = 0; i < 20 - userMobileData.length; i++) {
|
||||
// topBytes.add(0);
|
||||
// }
|
||||
//
|
||||
// // userMobileIP
|
||||
// var userMobileIPList = userMobileIP!.split(".");
|
||||
// userMobileIPList.forEach((element) {
|
||||
// topBytes.add(int.parse(element));
|
||||
// });
|
||||
|
||||
topBytes.addAll([
|
||||
1, 1, 1, 1, // 时间戳
|
||||
1, 0, // 音频
|
||||
@ -307,13 +198,13 @@ class RealTimePictureLogic extends BaseGetXController {
|
||||
topBytes[6] = (state.udpSendDataFrameNumber & 0x000000FF);
|
||||
topBytes[7] = ((state.udpSendDataFrameNumber & 0x0000FF00) >> 8);
|
||||
|
||||
print(
|
||||
"udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}");
|
||||
// print(
|
||||
// "udpSendDataFrameNumber:${state.udpSendDataFrameNumber} topBytes[63]:${topBytes[6]} topBytes[64]:${topBytes[7]}");
|
||||
topBytes.addAll(bytes);
|
||||
Get.log("setVoiceBytes:$topBytes");
|
||||
|
||||
UDPSenderManage.sendMainProtocol(
|
||||
command: 150,
|
||||
command: 152,
|
||||
commandTypeIsCalling: 1,
|
||||
subCommand: 8,
|
||||
lockID: lockID,
|
||||
@ -427,6 +318,7 @@ class RealTimePictureLogic extends BaseGetXController {
|
||||
void onClose() {
|
||||
// TODO: implement onClose
|
||||
print("锁详情界面销毁了");
|
||||
CallTalk().stopPcmSound();
|
||||
_getTVDataRefreshUIEvent!.cancel();
|
||||
_getUDPStatusRefreshUIEvent!.cancel();
|
||||
if (state.oneMinuteTimeTimer != null) {
|
||||
@ -434,8 +326,5 @@ class RealTimePictureLogic extends BaseGetXController {
|
||||
}
|
||||
stopProcessing();
|
||||
state.listData.value = Uint8List(0);
|
||||
if (state.realTimePicTimer != null) {
|
||||
state.realTimePicTimer.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/talk/call/callTalk.dart';
|
||||
|
||||
import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/showTFView.dart';
|
||||
@ -32,8 +33,11 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
Get.back();
|
||||
});
|
||||
|
||||
state.animationController =
|
||||
AnimationController(duration: const Duration(seconds: 1), vsync: this);
|
||||
state.animationController = AnimationController(
|
||||
vsync: this, // 确保使用的TickerProvider是当前Widget
|
||||
duration: const Duration(seconds: 1),
|
||||
);
|
||||
;
|
||||
state.animationController.repeat();
|
||||
//动画开始、结束、向前移动或向后移动时会调用StatusListener
|
||||
state.animationController.addStatusListener((status) {
|
||||
@ -200,8 +204,12 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
// 接听
|
||||
Obx(() => bottomBtnItemWidget(
|
||||
getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async {
|
||||
Toast.show(msg: "监视中无音频");
|
||||
//监视状态下不能发送录音
|
||||
Toast.show(msg: '监视状态下不能发送录音');
|
||||
}, longPress: () async {
|
||||
/*
|
||||
// 开始长按
|
||||
print("onLongPress");
|
||||
//获取麦克风权限
|
||||
await logic.getPermissionStatus().then((value) async {
|
||||
if (!value) {
|
||||
@ -209,15 +217,8 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
}
|
||||
|
||||
// state.isSenderAudioData.value = false;
|
||||
print("发送接听了");
|
||||
// 刚进来是接听状态,然后改为长按对讲
|
||||
logic.udpAnswerAction();
|
||||
});
|
||||
*/
|
||||
}, longPress: () {
|
||||
/*
|
||||
// 开始长按
|
||||
print("onLongPress");
|
||||
|
||||
state.listAudioData.value = <int>[];
|
||||
if (state.udpStatus.value == 8) {
|
||||
state.udpStatus.value = 9;
|
||||
@ -238,6 +239,7 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
"images/main/icon_lockDetail_hangUp.png", "挂断", Colors.red, () async {
|
||||
// 挂断
|
||||
logic.udpHangUpAction();
|
||||
CallTalk().stopPcmSound();
|
||||
Get.back();
|
||||
}),
|
||||
bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png",
|
||||
@ -257,7 +259,7 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
case 9:
|
||||
return "images/main/icon_lockDetail_monitoringTalkback.png";
|
||||
default:
|
||||
return "images/main/icon_lockDetail_monitoringAnswerCalls.png";
|
||||
return "images/main/icon_lockDetail_monitoringUnTalkback.png";
|
||||
}
|
||||
}
|
||||
|
||||
@ -268,7 +270,7 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
case 9:
|
||||
return "松开发送";
|
||||
default:
|
||||
return "接听";
|
||||
return "长按说话";
|
||||
}
|
||||
}
|
||||
|
||||
@ -377,8 +379,11 @@ class _RealTimePicturePageState extends State<RealTimePicturePage>
|
||||
|
||||
void _handleFailure() {
|
||||
// 在这里处理失败的逻辑
|
||||
state.animationController.stop();
|
||||
CallTalk().stopPcmSound();
|
||||
state.realTimePicTimer.cancel();
|
||||
if (state.animationController != null) {
|
||||
state.animationController.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -155,6 +155,8 @@ class CommandUDPReciverManager {
|
||||
{
|
||||
//监视成功
|
||||
print("监视成功");
|
||||
UDPTalkClass().status = 8;
|
||||
eventBus.fire(GetUDPStatusMonitorUI(UDPTalkClass().status));
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
@ -192,6 +194,8 @@ class CommandUDPReciverManager {
|
||||
break;
|
||||
case 30:
|
||||
{
|
||||
CallTalk().stopPcmSound();
|
||||
|
||||
// 监视结束
|
||||
if ((data[7] & 0x3) == 1) {
|
||||
// 对方结束监视
|
||||
@ -200,6 +204,7 @@ class CommandUDPReciverManager {
|
||||
//结束监视反馈
|
||||
print("结束监视反馈");
|
||||
}
|
||||
|
||||
// Toast.show(msg: "对方已结束监视");
|
||||
// UDPTalkClass().status = 0;
|
||||
// UDPTalkClass().isBeCall = false;
|
||||
|
||||
@ -62,6 +62,12 @@ class GetUDPStatusRefreshUI {
|
||||
GetUDPStatusRefreshUI(this.udpStatus);
|
||||
}
|
||||
|
||||
/// 获取到UDP接收状态然后刷新监控界面
|
||||
class GetUDPStatusMonitorUI {
|
||||
int udpStatus;
|
||||
GetUDPStatusMonitorUI(this.udpStatus);
|
||||
}
|
||||
|
||||
/// 获取到第一帧图片数据后跳转
|
||||
class GetFirstFrameGoPush {
|
||||
bool isFirstFrame;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user