77 lines
2.2 KiB
Dart
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());
|
|
}
|