1,本地持久化锁别名

2,对讲锁 新增本地通知用于设备处于后台及前台的呼叫提醒
3,解决接听成功后,超过六十秒的安全处理及逻辑优化
This commit is contained in:
Daisy 2024-03-25 17:33:40 +08:00
parent 7917f585ab
commit 063e62d087
10 changed files with 95 additions and 37 deletions

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/translations/trans_lib.dart'; import 'package:star_lock/translations/trans_lib.dart';
import 'app.dart'; import 'app.dart';
@ -17,6 +18,8 @@ FutureOr<void> main() async {
// //
await _initTranslation(); await _initTranslation();
initLocalNotification();
runApp(MyApp()); runApp(MyApp());
if (AppPlatform.isAndroid) { if (AppPlatform.isAndroid) {
@ -45,3 +48,14 @@ Future _setCommonServices() async {
} }
// Get.log(PlatformInfoService.to.info.version); // Get.log(PlatformInfoService.to.info.version);
} }
initLocalNotification() async {
WidgetsFlutterBinding.ensureInitialized();
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
final AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
final InitializationSettings initializationSettings =
InitializationSettings(android: initializationSettingsAndroid);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
}

View File

@ -724,6 +724,7 @@ class LockDetailLogic extends BaseGetXController {
// 3 // 3
state.lockAlias.value = event.setResult; state.lockAlias.value = event.setResult;
state.keyInfos.value.lockAlias = event.setResult; state.keyInfos.value.lockAlias = event.setResult;
Storage.setString(saveLockAlias, state.lockAlias.value);
} else if (event.type == 4) { } else if (event.type == 4) {
// 4 // 4
state.electricQuantity.value = int.parse(event.setResult); state.electricQuantity.value = int.parse(event.setResult);

View File

@ -108,6 +108,7 @@ class _LockDetailPageState extends State<LockDetailPage>
state.electricQuantity.value = state.keyInfos.value.electricQuantity!; state.electricQuantity.value = state.keyInfos.value.electricQuantity!;
state.isOpenPassageMode.value = state.keyInfos.value.passageMode!; state.isOpenPassageMode.value = state.keyInfos.value.passageMode!;
state.lockAlias.value = state.keyInfos.value.lockAlias!; state.lockAlias.value = state.keyInfos.value.lockAlias!;
Storage.setString(saveLockAlias, state.lockAlias.value);
BlueManage().connectDeviceName = BlueManage().connectDeviceName =
state.keyInfos.value.bluetooth!.bluetoothDeviceName!; state.keyInfos.value.bluetooth!.bluetoothDeviceName!;

View File

@ -3,6 +3,7 @@ import 'dart:math';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/call/callTalk.dart';
@ -43,36 +44,52 @@ class LockMonitoringLogic extends BaseGetXController {
void _getUDPStatusRefreshUIAction() { void _getUDPStatusRefreshUIAction() {
_getUDPStatusRefreshUIEvent = _getUDPStatusRefreshUIEvent =
eventBus.on<GetUDPStatusRefreshUI>().listen((event) { eventBus.on<GetUDPStatusRefreshUI>().listen((event) {
if (UDPTalkClass().isEndCall == true) {
state.oneMinuteTimeTimer.cancel();
return;
}
state.udpStatus.value = event.udpStatus; state.udpStatus.value = event.udpStatus;
if (state.udpStatus.value == 8) { if (state.udpStatus.value == 8) {
if (state.oneMinuteTime.value >= 60) {
// 60
_getUDPStatusRefreshUIEvent!.cancel();
if (state.oneMinuteTimeTimer != null) {
state.oneMinuteTimeTimer.cancel();
}
initiateUdpHangUpAction();
print('输出挂断1');
return;
}
// 60 // 60
state.oneMinuteTimeTimer = state.oneMinuteTimeTimer =
Timer.periodic(const Duration(seconds: 1), (Timer t) async { Timer.periodic(const Duration(seconds: 1), (Timer t) async {
state.oneMinuteTime.value++; state.oneMinuteTime.value++;
// Get.log('state.oneMinuteTime.value:${state.oneMinuteTime.value}'); // Get.log('state.oneMinuteTime.value:${state.oneMinuteTime.value}');
if (UDPTalkClass().isEndCall == true) { // if (state.oneMinuteTime.value >= 60) {
return; // // 60
} // _getUDPStatusRefreshUIEvent!.cancel();
if (state.oneMinuteTime.value >= 60) { // if (state.oneMinuteTimeTimer != null) {
// 60 // state.oneMinuteTimeTimer.cancel();
state.oneMinuteTimeTimer.cancel(); // }
state.oneMinuteTime.value = 0; // initiateUdpHangUpAction();
print('输出挂断1'); // print('输出挂断1');
// // state.oneMinuteTime.value = 0;
UDPSenderManage.sendMainProtocol( // //
command: 150, // UDPSenderManage.sendMainProtocol(
commandTypeIsCalling: 1, // command: 150,
subCommand: 30, // commandTypeIsCalling: 1,
lockID: UDPManage().lockId, // subCommand: 30,
lockIP: UDPManage().host, // lockID: UDPManage().lockId,
userMobile: await state.userUid, // lockIP: UDPManage().host,
userMobileIP: await state.userMobileIP, // userMobile: await state.userUid,
endData: []); // userMobileIP: await state.userMobileIP,
// endData: []);
CallTalk().stopPcmSound(); // CallTalk().stopPcmSound();
// // //
Get.back(); // Get.back();
} // }
}); });
} }
}); });
@ -93,6 +110,7 @@ class LockMonitoringLogic extends BaseGetXController {
// 6 // 6
if (state.answerSeconds >= 6) { if (state.answerSeconds >= 6) {
state.answerTimer.cancel(); state.answerTimer.cancel();
showToast("接听失败");
initiateUdpHangUpAction(); initiateUdpHangUpAction();
// UDPTalkClass().callNoAnswer(); // UDPTalkClass().callNoAnswer();
} }

View File

@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/call/callTalk.dart';
import 'package:star_lock/talk/udp/udp_talkClass.dart';
import '../../../../app_settings/app_colors.dart'; import '../../../../app_settings/app_colors.dart';
import '../../../../login/selectCountryRegion/common/index.dart'; import '../../../../login/selectCountryRegion/common/index.dart';
@ -25,8 +26,11 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
initAsync();
}
requestMicrophonePermission(); Future<void> initAsync() async {
await requestMicrophonePermission();
} }
@override @override
@ -196,6 +200,7 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
state.isClickHangUp.value = true; state.isClickHangUp.value = true;
} else { } else {
print('点了这里?'); print('点了这里?');
UDPTalkClass().stopLocalAudio();
} }
}), }),
bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png",

View File

@ -17,9 +17,7 @@ class CallTalk {
static int ABUF_NUM = 100; static int ABUF_NUM = 100;
static int FIRSTINDEX = 1; static int FIRSTINDEX = 1;
int status = 0; //
IframeInfo? iframe; // IframeInfo? iframe; //
bool getFirstFrame = false; //
List<int> allDataBytes = <int>[]; // List<int> allDataBytes = <int>[]; //
CallTalk._init() { CallTalk._init() {
@ -105,15 +103,19 @@ class CallTalk {
// //
if (getIframeIndex == iframe!.iframeIndex) { if (getIframeIndex == iframe!.iframeIndex) {
var getList = bb.sublist(77, bb.length); var getList = bb.sublist(POS_data, bb.length);
iframe!.bb!.addAll(getList); iframe!.bb!.addAll(getList);
} }
// print('iframe.bagNum: ${iframe!.bagNum} iframe.bagReceive: ${iframe!.bagReceive}'); // print(
// 'iframe.bagNum: ${iframe!.bagNum} iframe.bagReceive: ${iframe!.bagReceive}');
// //
if (iframe!.bagNum == iframe!.bagReceive) { if (iframe!.bagNum == iframe!.bagReceive &&
getIframeIndex == iframe!.iframeIndex) {
// print('播放第${iframe!.iframeIndex}帧 一帧图片的hexStringData: ${Uint8List.fromList(growableList)}'); // print('播放第${iframe!.iframeIndex}帧 一帧图片的hexStringData: ${Uint8List.fromList(growableList)}');
eventBus.fire(GetTVDataRefreshUI(iframe!.bb!)); eventBus.fire(GetTVDataRefreshUI(iframe!.bb!));
} else {
// print('接收到的包数不等于总包数');
} }
} }
} }

View File

@ -1,7 +1,5 @@
import 'dart:typed_data';
class IframeInfo { class IframeInfo {
int iframeIndex = -1; int iframeIndex = 0;
int iframeTime = 0; int iframeTime = 0;
int bagNum = 0; int bagNum = 0;
int bagReceive = 1; int bagReceive = 1;
@ -12,7 +10,7 @@ class IframeInfo {
int codecMode = 0; int codecMode = 0;
IframeInfo() { IframeInfo() {
iframeIndex = -1; iframeIndex = 0;
bagNum = 0; bagNum = 0;
bagReceive = 0; bagReceive = 0;
isFull = false; isFull = false;

View File

@ -114,8 +114,6 @@ class CommandUDPReciverManager {
// //
print("结束对讲反馈"); print("结束对讲反馈");
} }
UDPTalkClass().isEndCall = true;
LockMonitoringState().isClickHangUp.value = false;
UDPTalkClass().callNoAnswer(); UDPTalkClass().callNoAnswer();
// UDPTalkClass().status = 0; // UDPTalkClass().status = 0;
// UDPTalkClass().isBeCall = false; // UDPTalkClass().isBeCall = false;

View File

@ -1,8 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
import 'package:date_format/date_format.dart';
import 'package:fast_gbk/fast_gbk.dart'; import 'package:fast_gbk/fast_gbk.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart';
import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart'; import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart';
import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/call/callTalk.dart';
import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart';
@ -76,6 +77,10 @@ class UDPTalkClass {
Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"}); Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"});
} }
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
_showNotification(flutterLocalNotificationsPlugin);
playLocalAudio(); playLocalAudio();
if (isEndCall == true) { if (isEndCall == true) {
@ -95,6 +100,22 @@ class UDPTalkClass {
} }
} }
//
Future<void> _showNotification(
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) async {
const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails('your channel id', 'your channel name',
importance: Importance.max,
priority: Priority.high,
ticker: 'ticker');
const NotificationDetails platformChannelSpecifics =
NotificationDetails(android: androidPlatformChannelSpecifics);
var getLockName = await Storage.getString(saveLockAlias);
await flutterLocalNotificationsPlugin.show(
0, '呼叫提醒', '收到来自($getLockName)锁的呼叫。', platformChannelSpecifics,
payload: 'item x');
}
// call的本人 // call的本人
Future<bool> isCallMe(List<int>? data) async { Future<bool> isCallMe(List<int>? data) async {
final loginData = await Storage.getLoginData(); final loginData = await Storage.getLoginData();
@ -156,7 +177,7 @@ class UDPTalkClass {
CallTalk().stopPcmSound(); CallTalk().stopPcmSound();
status = 0; status = 0;
isBeCall = false; isBeCall = false;
isEndCall = false; isEndCall = true;
LockMonitoringState().isClickHangUp.value = false; LockMonitoringState().isClickHangUp.value = false;
eventBus.fire(GetUDPStatusRefreshUI(status)); eventBus.fire(GetUDPStatusRefreshUI(status));

View File

@ -6,7 +6,6 @@ import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../login/login/entity/LoginData.dart'; import '../login/login/entity/LoginData.dart';
import '../login/login/entity/LoginEntity.dart';
const saveBluePublicKey = "BluePublicKey"; const saveBluePublicKey = "BluePublicKey";
const saveBluePrivateKey = "BluePrivateKey"; const saveBluePrivateKey = "BluePrivateKey";
@ -20,6 +19,7 @@ const isAgreePosition = "isAgreePosition"; //是否同意获取位置弹窗
const isAgreeCamera = "isAgreeCamera"; /// const isAgreeCamera = "isAgreeCamera"; ///
const isShowUpdateVersion = "isShowUpdateVersion"; // const isShowUpdateVersion = "isShowUpdateVersion"; //
const saveLockAlias = "saveLockAlias"; //
const saveUserLoginData = "userLoginData"; const saveUserLoginData = "userLoginData";