init
This commit is contained in:
76
app/lib/services/sms_foreground_handler.dart
Normal file
76
app/lib/services/sms_foreground_handler.dart
Normal file
@@ -0,0 +1,76 @@
|
||||
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());
|
||||
}
|
||||
Reference in New Issue
Block a user