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.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.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
@ -35,6 +36,9 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="1"/> <!-- 将您的通知渠道ID替换为您的实际ID -->
<!-- 配置定位Service -->
<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">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

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

View File

@ -43,53 +43,29 @@ class LockMonitoringLogic extends BaseGetXController {
StreamSubscription? _getUDPStatusRefreshUIEvent;
void _getUDPStatusRefreshUIAction() {
_getUDPStatusRefreshUIEvent =
eventBus.on<GetUDPStatusRefreshUI>().listen((event) {
if (UDPTalkClass().isEndCall == true) {
eventBus.on<GetUDPStatusRefreshUI>().listen((event) async {
state.udpStatus.value = event.udpStatus;
state.oneMinuteTime.value = 0;
// 退
if (state.udpStatus.value == 0 && UDPTalkClass().isEndCall == true) {
state.oneMinuteTimeTimer.cancel();
state.oneMinuteTime.value = 0;
return;
}
state.udpStatus.value = event.udpStatus;
//
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
state.oneMinuteTimeTimer.cancel(); //
state.oneMinuteTimeTimer =
Timer.periodic(const Duration(seconds: 1), (Timer t) async {
Timer.periodic(const Duration(seconds: 1), (Timer t) {
state.oneMinuteTime.value++;
// Get.log('state.oneMinuteTime.value:${state.oneMinuteTime.value}');
// if (state.oneMinuteTime.value >= 60) {
// // 60
// _getUDPStatusRefreshUIEvent!.cancel();
// if (state.oneMinuteTimeTimer != null) {
// 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();
// }
if (state.oneMinuteTime.value >= 60) {
t.cancel(); //
initiateUdpHangUpAction(); //
print('通话时间超过60秒自动挂断');
state.oneMinuteTime.value = 0;
}
});
}
});
@ -98,8 +74,8 @@ class LockMonitoringLogic extends BaseGetXController {
//
void initiateUdpAnswerAction() {
state.answerTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
state.answerSeconds++;
udpAnswerAction();
state.answerSeconds++;
//
if (UDPTalkClass().status == 8) {

View File

@ -169,7 +169,11 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
//
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) {
logic.initiateUdpAnswerAction();
state.isClickAnswer.value = true;
@ -200,6 +204,7 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
state.isClickHangUp.value = true;
} else {
print('点了这里?');
state.isClickHangUp.value = false;
UDPTalkClass().stopLocalAudio();
}
}),

View File

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

View File

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

View File

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