1,新增安卓本地通知用于对讲在后台及前台运行时的呼叫提醒

2,优化点击接听后的显示逻辑,以及接听失败的处理和提醒
3,对讲页面刷新UI的事件逻辑优化完善
This commit is contained in:
Daisy 2024-03-26 14:03:46 +08:00
parent 063e62d087
commit 56f4717c95
8 changed files with 41 additions and 58 deletions

View File

@ -27,6 +27,7 @@
<!--允许麦克风权限,用于录音发送--> <!--允许麦克风权限,用于录音发送-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.VIBRATE"/>
@ -35,6 +36,9 @@
<meta-data <meta-data
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="1"/> <!-- 将您的通知渠道ID替换为您的实际ID -->
<!-- 配置定位Service --> <!-- 配置定位Service -->
<service android:name="com.amap.api.location.APSService"/> <service android:name="com.amap.api.location.APSService"/>
<activity android:name="com.skychip.lock.MainActivity" android:exported="true" android:screenOrientation="portrait" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <activity android:name="com.skychip.lock.MainActivity" android:exported="true" android:screenOrientation="portrait" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -53,9 +53,9 @@ initLocalNotification() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin(); FlutterLocalNotificationsPlugin();
final AndroidInitializationSettings initializationSettingsAndroid = const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('app_icon'); AndroidInitializationSettings('app_icon');
final InitializationSettings initializationSettings = const InitializationSettings initializationSettings =
InitializationSettings(android: initializationSettingsAndroid); InitializationSettings(android: initializationSettingsAndroid);
await flutterLocalNotificationsPlugin.initialize(initializationSettings); await flutterLocalNotificationsPlugin.initialize(initializationSettings);
} }

View File

@ -43,53 +43,29 @@ class LockMonitoringLogic extends BaseGetXController {
StreamSubscription? _getUDPStatusRefreshUIEvent; StreamSubscription? _getUDPStatusRefreshUIEvent;
void _getUDPStatusRefreshUIAction() { void _getUDPStatusRefreshUIAction() {
_getUDPStatusRefreshUIEvent = _getUDPStatusRefreshUIEvent =
eventBus.on<GetUDPStatusRefreshUI>().listen((event) { eventBus.on<GetUDPStatusRefreshUI>().listen((event) async {
if (UDPTalkClass().isEndCall == true) { state.udpStatus.value = event.udpStatus;
state.oneMinuteTime.value = 0;
// 退
if (state.udpStatus.value == 0 && UDPTalkClass().isEndCall == true) {
state.oneMinuteTimeTimer.cancel(); state.oneMinuteTimeTimer.cancel();
state.oneMinuteTime.value = 0;
return; return;
} }
state.udpStatus.value = event.udpStatus; //
if (state.udpStatus.value == 8) { if (state.udpStatus.value == 8) {
if (state.oneMinuteTime.value >= 60) { state.oneMinuteTimeTimer.cancel(); //
// 60
_getUDPStatusRefreshUIEvent!.cancel();
if (state.oneMinuteTimeTimer != null) {
state.oneMinuteTimeTimer.cancel();
}
initiateUdpHangUpAction();
print('输出挂断1');
return;
}
// 60
state.oneMinuteTimeTimer = state.oneMinuteTimeTimer =
Timer.periodic(const Duration(seconds: 1), (Timer t) async { Timer.periodic(const Duration(seconds: 1), (Timer t) {
state.oneMinuteTime.value++; state.oneMinuteTime.value++;
// Get.log('state.oneMinuteTime.value:${state.oneMinuteTime.value}'); if (state.oneMinuteTime.value >= 60) {
// if (state.oneMinuteTime.value >= 60) { t.cancel(); //
// // 60 initiateUdpHangUpAction(); //
// _getUDPStatusRefreshUIEvent!.cancel(); print('通话时间超过60秒自动挂断');
// if (state.oneMinuteTimeTimer != null) { state.oneMinuteTime.value = 0;
// state.oneMinuteTimeTimer.cancel(); }
// }
// initiateUdpHangUpAction();
// print('输出挂断1');
// state.oneMinuteTime.value = 0;
// //
// UDPSenderManage.sendMainProtocol(
// command: 150,
// commandTypeIsCalling: 1,
// subCommand: 30,
// lockID: UDPManage().lockId,
// lockIP: UDPManage().host,
// userMobile: await state.userUid,
// userMobileIP: await state.userMobileIP,
// endData: []);
// CallTalk().stopPcmSound();
// //
// Get.back();
// }
}); });
} }
}); });
@ -98,8 +74,8 @@ class LockMonitoringLogic extends BaseGetXController {
// //
void initiateUdpAnswerAction() { void initiateUdpAnswerAction() {
state.answerTimer = Timer.periodic(const Duration(seconds: 1), (timer) { state.answerTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
state.answerSeconds++;
udpAnswerAction(); udpAnswerAction();
state.answerSeconds++;
// //
if (UDPTalkClass().status == 8) { if (UDPTalkClass().status == 8) {

View File

@ -169,7 +169,11 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
// //
Obx(() => bottomBtnItemWidget( Obx(() => bottomBtnItemWidget(
getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async { state.isClickAnswer.value == true
? 'images/main/icon_lockDetail_monitoringUnTalkback.png'
: getAnswerBtnImg(),
state.isClickAnswer.value == true ? '长按说话' : getAnswerBtnName(),
Colors.white, () async {
if (state.isClickAnswer.value == false) { if (state.isClickAnswer.value == false) {
logic.initiateUdpAnswerAction(); logic.initiateUdpAnswerAction();
state.isClickAnswer.value = true; state.isClickAnswer.value = true;
@ -200,6 +204,7 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
state.isClickHangUp.value = true; state.isClickHangUp.value = true;
} else { } else {
print('点了这里?'); print('点了这里?');
state.isClickHangUp.value = false;
UDPTalkClass().stopLocalAudio(); UDPTalkClass().stopLocalAudio();
} }
}), }),

View File

@ -68,6 +68,7 @@ class CommandUDPReciverManager {
// //
UDPTalkClass().stopLocalAudio(); UDPTalkClass().stopLocalAudio();
eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status)); eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status));
print('接听反馈刷新UI1');
} }
} }
break; break;
@ -105,7 +106,6 @@ class CommandUDPReciverManager {
break; break;
case 30: case 30:
{ {
print('反馈挂断1');
// //
if ((data[7] & 0x3) == 1) { if ((data[7] & 0x3) == 1) {
// //
@ -114,13 +114,13 @@ class CommandUDPReciverManager {
// //
print("结束对讲反馈"); print("结束对讲反馈");
} }
UDPTalkClass().callNoAnswer(); UDPTalkClass().status = 0;
// UDPTalkClass().status = 0; UDPTalkClass().isBeCall = false;
// UDPTalkClass().isBeCall = false; UDPTalkClass().stopLocalAudio();
// UDPTalkClass().stopLocalAudio(); CallTalk().stopPcmSound();
// CallTalk().stopPcmSound(); eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status));
// eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status)); Get.back();
// Get.back(); print('挂断反馈刷新UI1');
} }
break; break;
case 140: case 140:

View File

@ -104,9 +104,10 @@ class UDPTalkClass {
Future<void> _showNotification( Future<void> _showNotification(
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) async { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) async {
const AndroidNotificationDetails androidPlatformChannelSpecifics = const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails('your channel id', 'your channel name', AndroidNotificationDetails('1', 'flutter_channel',
importance: Importance.max, importance: Importance.max,
priority: Priority.high, priority: Priority.high,
playSound: true,
ticker: 'ticker'); ticker: 'ticker');
const NotificationDetails platformChannelSpecifics = const NotificationDetails platformChannelSpecifics =
NotificationDetails(android: androidPlatformChannelSpecifics); NotificationDetails(android: androidPlatformChannelSpecifics);
@ -171,16 +172,13 @@ class UDPTalkClass {
// //
void callNoAnswer() { void callNoAnswer() {
print('无应答处理'); // print('无应答处理');
stopLocalAudio(); stopLocalAudio();
CallTalk().stopPcmSound(); CallTalk().stopPcmSound();
status = 0; status = 0;
isBeCall = false; isBeCall = false;
isEndCall = true; isEndCall = true;
LockMonitoringState().isClickHangUp.value = false; LockMonitoringState().isClickHangUp.value = false;
eventBus.fire(GetUDPStatusRefreshUI(status));
Get.back(); Get.back();
} }
} }

View File

@ -15,7 +15,7 @@ class XSJPushProvider {
appKey: "7ff37d174c1a568a89e98dad", appKey: "7ff37d174c1a568a89e98dad",
channel: "flutter_channel", channel: "flutter_channel",
production: false, production: false,
debug: true, debug: false,
); );
jpush.addEventHandler( jpush.addEventHandler(