1,新增安卓本地通知用于对讲在后台及前台运行时的呼叫提醒
2,优化点击接听后的显示逻辑,以及接听失败的处理和提醒 3,对讲页面刷新UI的事件逻辑优化完善
This commit is contained in:
parent
063e62d087
commit
56f4717c95
@ -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">
|
||||||
|
|||||||
BIN
star_lock/android/app/src/main/res/drawable/app_icon.png
Normal file
BIN
star_lock/android/app/src/main/res/drawable/app_icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user