feat: 安卓端本地自定义铃声方案完成

This commit is contained in:
“DaisyWu” 2025-02-18 10:42:08 +08:00
parent b45507fabb
commit f33c5c76eb
14 changed files with 51 additions and 51 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

BIN
images/call_me_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -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/login/entity/LoginEntity.dart';
import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart';
import 'package:star_lock/tools/eventBusEventManage.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/push/xs_jPhush.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
@ -70,7 +71,7 @@ class StarLockRegisterLogic extends BaseGetXController {
Storage.saveLoginData(entity.data); Storage.saveLoginData(entity.data);
Storage.setBool(saveIsVip, entity.data!.isVip == 1); Storage.setBool(saveIsVip, entity.data!.isVip == 1);
eventBus.fire(MineInfoChangeRefreshUI()); eventBus.fire(MineInfoChangeRefreshUI());
XSJPushProvider().initLocalNotification(isCancelLocalPush: false); NotificationService().init(); //
Get.offNamedUntil(Routers.starLockMain, (Route route) => false); Get.offNamedUntil(Routers.starLockMain, (Route route) => false);
BlueManage().scanDevices.clear(); // BlueManage().scanDevices.clear(); //
} else { } else {

View File

@ -96,6 +96,5 @@ Future<void> privacySDKInitialization() async {
// JPush服务 // JPush服务
final XSJPushProvider jpushProvider = XSJPushProvider(); final XSJPushProvider jpushProvider = XSJPushProvider();
await jpushProvider.initJPushService(); await jpushProvider.initJPushService();
await jpushProvider.initLocalNotification(isCancelLocalPush: false);
NotificationService().init(); // NotificationService().init(); //
} }

View File

@ -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/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart';
import 'package:star_lock/tools/eventBusEventManage.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/push/xs_jPhush.dart';
import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/tools/store_service.dart'; import 'package:star_lock/tools/store_service.dart';
@ -92,7 +93,7 @@ class LockMainLogic extends BaseGetXController {
// JPush服务并绑定设备ID // JPush服务并绑定设备ID
final XSJPushProvider jpushProvider = XSJPushProvider(); final XSJPushProvider jpushProvider = XSJPushProvider();
await jpushProvider.initJPushService(); await jpushProvider.initJPushService();
await jpushProvider.initLocalNotification(isCancelLocalPush: false); NotificationService().init(); //
} }
// //
@ -364,7 +365,7 @@ class LockMainLogic extends BaseGetXController {
// JPush服务并绑定设备ID // JPush服务并绑定设备ID
final XSJPushProvider jpushProvider = XSJPushProvider(); final XSJPushProvider jpushProvider = XSJPushProvider();
await jpushProvider.initJPushService(); await jpushProvider.initJPushService();
await jpushProvider.initLocalNotification(isCancelLocalPush: false); NotificationService().init(); //
// UDP // UDP
// AppLog.log('onReady() LockMainLogic'); // AppLog.log('onReady() LockMainLogic');

View File

@ -10,6 +10,7 @@ import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_
import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart';
import 'package:star_lock/tools/baseGetXController.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/push/xs_jPhush.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
@ -91,7 +92,7 @@ class LockMainXHJLogic extends BaseGetXController {
// JPush服务并绑定设备ID // JPush服务并绑定设备ID
final XSJPushProvider jpushProvider = XSJPushProvider(); final XSJPushProvider jpushProvider = XSJPushProvider();
await jpushProvider.initJPushService(); await jpushProvider.initJPushService();
await jpushProvider.initLocalNotification(isCancelLocalPush: false); NotificationService().init(); //
} }
// //

View File

@ -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/userSettingInfoEntity.dart';
import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart'; import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart';
import 'package:star_lock/talk/starChart/star_chart_manage.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/push/xs_jPhush.dart';
import 'package:star_lock/tools/showCupertinoAlertView.dart'; import 'package:star_lock/tools/showCupertinoAlertView.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
@ -141,6 +142,9 @@ class MineSetLogic extends BaseGetXController {
'logout_result': '成功', 'logout_result': '成功',
}); });
//
await NotificationService().cancelAllNotifications();
// UdpHelp().closeUDP(); // UdpHelp().closeUDP();
logOut(); logOut();
@ -148,7 +152,6 @@ class MineSetLogic extends BaseGetXController {
Get.updateLocale(Get.deviceLocale!); Get.updateLocale(Get.deviceLocale!);
BlueManage().disconnect(); BlueManage().disconnect();
XSJPushProvider().initLocalNotification(isCancelLocalPush: true);
StartChartManage().destruction(); StartChartManage().destruction();
StartChartManage().closeUdpSocket(); StartChartManage().closeUdpSocket();
Get.offNamedUntil(Routers.starLockLoginPage, (Route route) => false); Get.offNamedUntil(Routers.starLockLoginPage, (Route route) => false);

View File

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:flutter/services.dart'; 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/generic.pb.dart';
import 'package:star_lock/talk/starChart/proto/talk_expect.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/talk/starChart/proto/talk_request.pb.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
class UdpTalkRequestHandler extends ScpMessageBaseHandle class UdpTalkRequestHandler extends ScpMessageBaseHandle
@ -62,7 +64,10 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
// //
_handleSendExpect(); _handleSendExpect();
// //
playRingtone(); //test:使
if (Platform.isIOS) {
playRingtone();
}
// //
_showTalkRequestNotification(talkObjectName: talkObjectName); _showTalkRequestNotification(talkObjectName: talkObjectName);
// //
@ -78,9 +83,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
// //
Future<void> _showTalkRequestNotification( Future<void> _showTalkRequestNotification(
{required String talkObjectName}) async { {required String talkObjectName}) async {
/** final Map<String, dynamic> message = {
*
final Map<String, dynamic> message = {
'platform': 'all', 'platform': 'all',
'audience': 'all', 'audience': 'all',
'notification': <String, Map<String, Object>>{ 'notification': <String, Map<String, Object>>{
@ -96,7 +99,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
}; };
XSJPushProvider().showCustomNotification(message); XSJPushProvider().showCustomNotification(message);
*/ /*
const AndroidNotificationDetails androidPlatformChannelSpecifics = const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails('1', 'flutter_channel', AndroidNotificationDetails('1', 'flutter_channel',
importance: Importance.max, importance: Importance.max,
@ -113,6 +116,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr, await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr,
'${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}', platformChannelSpecifics, '${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}', platformChannelSpecifics,
payload: 'item x'); payload: 'item x');
*/
} }
@override @override

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
@ -76,7 +77,10 @@ class ScpMessageBaseHandle {
// //
void playRingtone() async { void playRingtone() async {
await audioManager.playRingtone(); //test:使
if (Platform.isIOS) {
await audioManager.playRingtone();
}
} }
// //

View File

@ -9,4 +9,6 @@ class MessageConstant {
static const int keyReceive = 40; static const int keyReceive = 40;
// //
static const int lockSetChange = 50; static const int lockSetChange = 50;
//
static const int talkPushBigImage = 70;
} }

View File

@ -4,6 +4,8 @@ import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/push/message_constant.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 { class MessageManagement {
// //
@ -105,6 +107,10 @@ class MessageManagement {
// } // }
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId)); eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
break; break;
case MessageConstant.talkPushBigImage:
// XSJPushProvider().showCustomNotification(data);
break;
default: default:
throw Exception('无法识别eventNo 参数:$eventNo'); throw Exception('无法识别eventNo 参数:$eventNo');
} }

View File

@ -39,7 +39,7 @@ class NotificationService {
NotificationDetails(android: androidPlatformChannelSpecifics); NotificationDetails(android: androidPlatformChannelSpecifics);
await _flutterLocalNotificationsPlugin.show( await _flutterLocalNotificationsPlugin.show(
0, 1,
title, title,
body, body,
platformChannelSpecifics, platformChannelSpecifics,
@ -52,7 +52,7 @@ class NotificationService {
// // // //
// final ByteArrayAndroidBitmap? bigPicture = await _downloadImage(imageUrl); // 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 Uint8List imageBytes = imageData.buffer.asUint8List();
final ByteArrayAndroidBitmap bigPicture = final ByteArrayAndroidBitmap bigPicture =
ByteArrayAndroidBitmap(imageBytes); ByteArrayAndroidBitmap(imageBytes);
@ -76,15 +76,14 @@ class NotificationService {
importance: Importance.max, importance: Importance.max,
priority: Priority.high, priority: Priority.high,
styleInformation: bigPictureStyleInformation, styleInformation: bigPictureStyleInformation,
sound: const RawResourceAndroidNotificationSound( sound: const RawResourceAndroidNotificationSound('ring_wx'), //
'assets/ring1.mp3'), //
); );
final NotificationDetails platformChannelSpecifics = final NotificationDetails platformChannelSpecifics =
NotificationDetails(android: androidPlatformChannelSpecifics); NotificationDetails(android: androidPlatformChannelSpecifics);
await _flutterLocalNotificationsPlugin.show( await _flutterLocalNotificationsPlugin.show(
0, 1,
title, title,
body, body,
platformChannelSpecifics, platformChannelSpecifics,
@ -104,4 +103,9 @@ class NotificationService {
} }
return null; return null;
} }
///
Future<void> cancelAllNotifications() async {
await _flutterLocalNotificationsPlugin.cancelAll();
}
} }

View File

@ -1,13 +1,9 @@
import 'dart:io'; 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:jpush_flutter/jpush_flutter.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart';
import 'package:star_lock/network/api_repository.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/baseGetXController.dart';
import 'package:star_lock/tools/push/message_management.dart'; import 'package:star_lock/tools/push/message_management.dart';
import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/notification_service.dart';
@ -27,7 +23,7 @@ class XSJPushProvider {
return; return;
} }
print('jPushKey ${F.jPushKey}'); AppLog.log('jPushKey ${F.jPushKey}');
// final String? bundleIdentifier = // final String? bundleIdentifier =
// await NativeInteractionTool().getBundleIdentifier(); // await NativeInteractionTool().getBundleIdentifier();
// print('bundleIdentifier: $bundleIdentifier'); // print('bundleIdentifier: $bundleIdentifier');
@ -46,7 +42,7 @@ class XSJPushProvider {
AppLog.log('JPush initialized.'); AppLog.log('JPush initialized.');
final String rid = await jpush.getRegistrationID(); final String rid = await jpush.getRegistrationID();
print('flutter get registration id : $rid'); AppLog.log('flutter get registration id : $rid');
pushBindDeviceID(rid); pushBindDeviceID(rid);
} }
@ -55,8 +51,7 @@ class XSJPushProvider {
jpush.addEventHandler( jpush.addEventHandler(
onReceiveNotification: (Map<String, dynamic> message) async { onReceiveNotification: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotification: $message'); AppLog.log('onReceiveNotification: $message');
// flutter_local_notifications // showCustomNotification(message);
showCustomNotification(message);
}, },
onOpenNotification: (Map<String, dynamic> message) async { onOpenNotification: (Map<String, dynamic> message) async {
AppLog.log('onOpenNotification: $message'); AppLog.log('onOpenNotification: $message');
@ -86,16 +81,6 @@ class XSJPushProvider {
// Remove the incorrect addEventHandler call // Remove the incorrect addEventHandler call
} }
Future<void> showCustomNotification(Map<String, dynamic> 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<void> pushBindDeviceID(String deviceID) async { Future<void> pushBindDeviceID(String deviceID) async {
try { try {
if (deviceID.isEmpty) { if (deviceID.isEmpty) {
@ -118,22 +103,12 @@ class XSJPushProvider {
} }
} }
// isCancelLocalPush void showCustomNotification(Map<String, dynamic> data) {
Future<void> initLocalNotification({required bool isCancelLocalPush}) async { final String title = data['notification']['android']['title'] ?? '默认标题';
WidgetsFlutterBinding.ensureInitialized(); final String content = data['notification']['android']['alert'] ?? '默认内容';
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = final String imageUrl = data['notification']['android']['extras']
FlutterLocalNotificationsPlugin(); ?['image_url']; // extras
if (Platform.isAndroid) { NotificationService().showImageNotification(title, content, imageUrl);
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
const InitializationSettings initializationSettings =
InitializationSettings(android: initializationSettingsAndroid);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
if (isCancelLocalPush) {
await flutterLocalNotificationsPlugin.cancelAll();
}
} }
} }