Files
transfer_sms/app/lib/services/sms_foreground_handler.dart
2026-04-28 22:04:24 +08:00

77 lines
2.2 KiB
Dart

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<void> onStart(DateTime timestamp, TaskStarter starter) async {
_startListening();
}
@override
void onRepeatEvent(DateTime timestamp) {}
@override
Future<void> 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());
}