import 'dart:async'; import 'dart:convert'; import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:telephony/telephony.dart' as tel; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; import '../models/sms_message.dart'; class SmsForegroundHandler extends TaskHandler { StreamSubscription? _smsSub; int _uploadedCount = 0; @override Future onStart(DateTime timestamp, TaskStarter starter) async { _startListening(); } @override void onRepeatEvent(DateTime timestamp) {} @override Future onDestroy(DateTime timestamp) async { _smsSub?.cancel(); } @override void onNotificationPressed() { FlutterForegroundTask.launchApp('/'); } void _startListening() async { final telephony = tel.Telephony.instance; final prefs = await SharedPreferences.getInstance(); final baseUrl = prefs.getString('server_url') ?? ''; final token = prefs.getString('token') ?? ''; telephony.listenIncomingSms( onNewMessage: (tel.SmsMessage sms) async { final msg = SmsMessage( phoneNumber: sms.address ?? '', contactName: sms.address, content: sms.body ?? '', type: 'received', smsDate: DateTime.now().toUtc().toIso8601String(), ); if (baseUrl.isNotEmpty && token.isNotEmpty) { try { await http.post( Uri.parse('$baseUrl/api/sms/upload'), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer $token', }, body: jsonEncode([msg.toJson()]), ); _uploadedCount++; FlutterForegroundTask.updateService( notificationText: '已自动上传 $_uploadedCount 条短信', ); } catch (_) { FlutterForegroundTask.updateService( notificationText: '上传失败,等待重试... (已上传 $_uploadedCount 条)', ); } } }, listenInBackground: false, ); } } @pragma('vm:entry-point') void startCallback() { FlutterForegroundTask.setTaskHandler(SmsForegroundHandler()); }