diff --git a/android/app/src/main/res/raw/ring_wx.mp3 b/android/app/src/main/res/raw/ring_wx.mp3 new file mode 100644 index 00000000..44374b89 Binary files /dev/null and b/android/app/src/main/res/raw/ring_wx.mp3 differ diff --git a/images/call_me_icon.jpg b/images/call_me_icon.jpg deleted file mode 100644 index ebc66b3e..00000000 Binary files a/images/call_me_icon.jpg and /dev/null differ diff --git a/images/call_me_icon.png b/images/call_me_icon.png new file mode 100644 index 00000000..e012b654 Binary files /dev/null and b/images/call_me_icon.png differ diff --git a/lib/login/register/starLock_register_logic.dart b/lib/login/register/starLock_register_logic.dart index b60be331..93890b8e 100755 --- a/lib/login/register/starLock_register_logic.dart +++ b/lib/login/register/starLock_register_logic.dart @@ -10,6 +10,7 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; +import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; @@ -70,7 +71,7 @@ class StarLockRegisterLogic extends BaseGetXController { Storage.saveLoginData(entity.data); Storage.setBool(saveIsVip, entity.data!.isVip == 1); eventBus.fire(MineInfoChangeRefreshUI()); - XSJPushProvider().initLocalNotification(isCancelLocalPush: false); + NotificationService().init(); // 初始化通知服务 Get.offNamedUntil(Routers.starLockMain, (Route route) => false); BlueManage().scanDevices.clear(); //清除设备缓存 } else { diff --git a/lib/main.dart b/lib/main.dart index f4e97afd..67d4785b 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -96,6 +96,5 @@ Future privacySDKInitialization() async { // 初始化JPush服务 final XSJPushProvider jpushProvider = XSJPushProvider(); await jpushProvider.initJPushService(); - await jpushProvider.initLocalNotification(isCancelLocalPush: false); NotificationService().init(); // 初始化通知服务 } diff --git a/lib/main/lockMian/lockMain/lockMain_logic.dart b/lib/main/lockMian/lockMain/lockMain_logic.dart index f092e8fd..ed823f64 100755 --- a/lib/main/lockMian/lockMain/lockMain_logic.dart +++ b/lib/main/lockMian/lockMain/lockMain_logic.dart @@ -14,6 +14,7 @@ import 'package:star_lock/main/lockMian/lockList/lockList_logic.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; +import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/store_service.dart'; @@ -92,7 +93,7 @@ class LockMainLogic extends BaseGetXController { // 初始化JPush服务并绑定设备ID final XSJPushProvider jpushProvider = XSJPushProvider(); await jpushProvider.initJPushService(); - await jpushProvider.initLocalNotification(isCancelLocalPush: false); + NotificationService().init(); // 初始化通知服务 } //绑定星图 @@ -364,7 +365,7 @@ class LockMainLogic extends BaseGetXController { // 初始化JPush服务并绑定设备ID final XSJPushProvider jpushProvider = XSJPushProvider(); await jpushProvider.initJPushService(); - await jpushProvider.initLocalNotification(isCancelLocalPush: false); + NotificationService().init(); // 初始化通知服务 // 开启UDP // AppLog.log('onReady() LockMainLogic'); diff --git a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart index df3d5fcb..ecdc2214 100755 --- a/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart +++ b/lib/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart @@ -10,6 +10,7 @@ import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_ import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; @@ -91,7 +92,7 @@ class LockMainXHJLogic extends BaseGetXController { // 初始化JPush服务并绑定设备ID final XSJPushProvider jpushProvider = XSJPushProvider(); await jpushProvider.initJPushService(); - await jpushProvider.initLocalNotification(isCancelLocalPush: false); + NotificationService().init(); // 初始化通知服务 } //绑定星图 diff --git a/lib/mine/mineSet/mineSet/mineSet_logic.dart b/lib/mine/mineSet/mineSet/mineSet_logic.dart index 04dee223..33b0f61a 100755 --- a/lib/mine/mineSet/mineSet/mineSet_logic.dart +++ b/lib/mine/mineSet/mineSet/mineSet_logic.dart @@ -11,6 +11,7 @@ import 'package:star_lock/mine/mineSet/mineSet/mineSet_state.dart'; import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart'; import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; +import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/storage.dart'; @@ -141,6 +142,9 @@ class MineSetLogic extends BaseGetXController { 'logout_result': '成功', }); + // 取消所有本地通知 + await NotificationService().cancelAllNotifications(); + // UdpHelp().closeUDP(); logOut(); @@ -148,7 +152,6 @@ class MineSetLogic extends BaseGetXController { Get.updateLocale(Get.deviceLocale!); BlueManage().disconnect(); - XSJPushProvider().initLocalNotification(isCancelLocalPush: true); StartChartManage().destruction(); StartChartManage().closeUdpSocket(); Get.offNamedUntil(Routers.starLockLoginPage, (Route route) => false); diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index f339dd9a..e2d12488 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/services.dart'; @@ -14,6 +15,7 @@ import 'package:star_lock/talk/starChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/starChart/proto/generic.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_request.pb.dart'; +import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; class UdpTalkRequestHandler extends ScpMessageBaseHandle @@ -62,7 +64,10 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle // 发送预期数据、通知锁板需要获取视频数据 _handleSendExpect(); // 播放铃声 - playRingtone(); + //test:使用自定义铃声 + if (Platform.isIOS) { + playRingtone(); + } // 显示状态栏弹窗 _showTalkRequestNotification(talkObjectName: talkObjectName); // 设置为等待接听状态 @@ -78,9 +83,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle // 收到来电请求时进行本地通知 Future _showTalkRequestNotification( {required String talkObjectName}) async { - /** - * - final Map message = { + final Map message = { 'platform': 'all', 'audience': 'all', 'notification': >{ @@ -96,7 +99,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle }; XSJPushProvider().showCustomNotification(message); - */ + /* const AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails('1', 'flutter_channel', importance: Importance.max, @@ -113,6 +116,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr, '${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}。', platformChannelSpecifics, payload: 'item x'); + */ } @override diff --git a/lib/talk/starChart/handle/scp_message_base_handle.dart b/lib/talk/starChart/handle/scp_message_base_handle.dart index 1fbe013a..d60fadfd 100644 --- a/lib/talk/starChart/handle/scp_message_base_handle.dart +++ b/lib/talk/starChart/handle/scp_message_base_handle.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'dart:typed_data'; import 'package:audioplayers/audioplayers.dart'; @@ -76,7 +77,10 @@ class ScpMessageBaseHandle { // 播放铃声 void playRingtone() async { - await audioManager.playRingtone(); + //test:使用自定义铃声 + if (Platform.isIOS) { + await audioManager.playRingtone(); + } } // 停止播放铃声 diff --git a/lib/tools/push/message_constant.dart b/lib/tools/push/message_constant.dart index c81dd455..e4d222c1 100644 --- a/lib/tools/push/message_constant.dart +++ b/lib/tools/push/message_constant.dart @@ -9,4 +9,6 @@ class MessageConstant { static const int keyReceive = 40; //锁设置变更 static const int lockSetChange = 50; + //呼叫推送自定义大图模式 + static const int talkPushBigImage = 70; } diff --git a/lib/tools/push/message_management.dart b/lib/tools/push/message_management.dart index 0acff883..93f7c28d 100644 --- a/lib/tools/push/message_management.dart +++ b/lib/tools/push/message_management.dart @@ -4,6 +4,8 @@ import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/push/message_constant.dart'; +import 'package:star_lock/tools/push/notification_service.dart'; +import 'package:star_lock/tools/push/xs_jPhush.dart'; class MessageManagement { //分析消息数据 @@ -105,6 +107,10 @@ class MessageManagement { // } eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId)); break; + case MessageConstant.talkPushBigImage: + // XSJPushProvider().showCustomNotification(data); + break; + default: throw Exception('无法识别eventNo 参数:$eventNo'); } diff --git a/lib/tools/push/notification_service.dart b/lib/tools/push/notification_service.dart index 596f6735..9d078990 100644 --- a/lib/tools/push/notification_service.dart +++ b/lib/tools/push/notification_service.dart @@ -39,7 +39,7 @@ class NotificationService { NotificationDetails(android: androidPlatformChannelSpecifics); await _flutterLocalNotificationsPlugin.show( - 0, + 1, title, body, platformChannelSpecifics, @@ -52,7 +52,7 @@ class NotificationService { // //读取网络下载图片 // final ByteArrayAndroidBitmap? bigPicture = await _downloadImage(imageUrl); // 读取本地图片 - final ByteData imageData = await rootBundle.load('images/call_me_icon.jpg'); + final ByteData imageData = await rootBundle.load('images/call_me_icon.png'); final Uint8List imageBytes = imageData.buffer.asUint8List(); final ByteArrayAndroidBitmap bigPicture = ByteArrayAndroidBitmap(imageBytes); @@ -76,15 +76,14 @@ class NotificationService { importance: Importance.max, priority: Priority.high, styleInformation: bigPictureStyleInformation, - sound: const RawResourceAndroidNotificationSound( - 'assets/ring1.mp3'), // 自定义铃声 + sound: const RawResourceAndroidNotificationSound('ring_wx'), // 自定义铃声 ); final NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics); await _flutterLocalNotificationsPlugin.show( - 0, + 1, title, body, platformChannelSpecifics, @@ -104,4 +103,9 @@ class NotificationService { } return null; } + + /// 取消所有本地通知 + Future cancelAllNotifications() async { + await _flutterLocalNotificationsPlugin.cancelAll(); + } } diff --git a/lib/tools/push/xs_jPhush.dart b/lib/tools/push/xs_jPhush.dart index d21cf996..dc13b13b 100755 --- a/lib/tools/push/xs_jPhush.dart +++ b/lib/tools/push/xs_jPhush.dart @@ -1,13 +1,9 @@ import 'dart:io'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:jpush_flutter/jpush_flutter.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart'; import 'package:star_lock/network/api_repository.dart'; -import 'package:star_lock/tools/NativeInteractionTool.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/push/message_management.dart'; import 'package:star_lock/tools/push/notification_service.dart'; @@ -27,7 +23,7 @@ class XSJPushProvider { return; } - print('jPushKey ${F.jPushKey}'); + AppLog.log('jPushKey ${F.jPushKey}'); // final String? bundleIdentifier = // await NativeInteractionTool().getBundleIdentifier(); // print('bundleIdentifier: $bundleIdentifier'); @@ -46,7 +42,7 @@ class XSJPushProvider { AppLog.log('JPush initialized.'); final String rid = await jpush.getRegistrationID(); - print('flutter get registration id : $rid'); + AppLog.log('flutter get registration id : $rid'); pushBindDeviceID(rid); } @@ -55,8 +51,7 @@ class XSJPushProvider { jpush.addEventHandler( onReceiveNotification: (Map message) async { AppLog.log('onReceiveNotification: $message'); - // 这里可以用 flutter_local_notifications 自定义通知样式 - showCustomNotification(message); + // showCustomNotification(message); }, onOpenNotification: (Map message) async { AppLog.log('onOpenNotification: $message'); @@ -86,16 +81,6 @@ class XSJPushProvider { // Remove the incorrect addEventHandler call } - Future showCustomNotification(Map message) async { - final String title = message['notification']['android']['title'] ?? '默认标题'; - final String content = - message['notification']['android']['alert'] ?? '默认内容'; - final String imageUrl = message['notification']['android']['extras'] - ?['image_url']; // 从 extras 获取图片 - - NotificationService().showImageNotification(title, content, imageUrl); - } - Future pushBindDeviceID(String deviceID) async { try { if (deviceID.isEmpty) { @@ -118,22 +103,12 @@ class XSJPushProvider { } } -//本地通知初始化 isCancelLocalPush 是否取消所有本地通知 - Future initLocalNotification({required bool isCancelLocalPush}) async { - WidgetsFlutterBinding.ensureInitialized(); - final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); + void showCustomNotification(Map data) { + final String title = data['notification']['android']['title'] ?? '默认标题'; + final String content = data['notification']['android']['alert'] ?? '默认内容'; + final String imageUrl = data['notification']['android']['extras'] + ?['image_url']; // 从 extras 获取图片 - if (Platform.isAndroid) { - const AndroidInitializationSettings initializationSettingsAndroid = - AndroidInitializationSettings('app_icon'); - const InitializationSettings initializationSettings = - InitializationSettings(android: initializationSettingsAndroid); - await flutterLocalNotificationsPlugin.initialize(initializationSettings); - } - - if (isCancelLocalPush) { - await flutterLocalNotificationsPlugin.cancelAll(); - } + NotificationService().showImageNotification(title, content, imageUrl); } }