v2.55.3 — Code-Review-Fixes: foregroundServiceType (Android 14+), POST_NOTIFICATIONS-Check, FG-Service-Notification-Channel, try/catch _zeigeSyncNotification

CRITICAL:
- AndroidManifest: foregroundServiceType="dataSync" für BackgroundService (Android 14+ MissingForegroundServiceTypeException)
- main.dart: notificationChannelId + initialNotificationTitle + foregroundServiceTypes für FlutterBackgroundService (fehlende FG-Notification → ANR/crash nach 5s)

MEDIUM:
- sync_service.dart: POST_NOTIFICATIONS-Permission-Check vor _starteForegroundService (Android 13+)
- sync_service.dart: try/catch um _zeigeSyncNotification (plugin-dispose-Sicherheit)

flutter analyze: clean | flutter test: 194/194 passed
This commit is contained in:
Dustin
2026-08-06 18:17:25 +02:00
parent 7777297073
commit 85615d253c
3 changed files with 53 additions and 11 deletions
+25 -11
View File
@@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import '../database/db_helper.dart';
import '../models/song.dart';
@@ -577,18 +578,22 @@ class SyncService {
if (!Platform.isAndroid) return;
final maxP = gesamt > 0 ? gesamt : 1;
final p = aktuell > maxP ? maxP : aktuell;
notificationsPlugin.show(
id: _syncNotifyId,
title: 'Synchronisiere…',
body: gesamt > 0 ? '$aktuell / $gesamt Songs' : body,
notificationDetails: NotificationDetails(
android: syncNotificationDetails(
ongoing: true,
progress: p,
maxProgress: maxP,
try {
notificationsPlugin.show(
id: _syncNotifyId,
title: 'Synchronisiere…',
body: gesamt > 0 ? '$aktuell / $gesamt Songs' : body,
notificationDetails: NotificationDetails(
android: syncNotificationDetails(
ongoing: true,
progress: p,
maxProgress: maxP,
),
),
),
);
);
} catch (_) {
// Plugin kann beim App-Exit bereits disposed sein
}
}
/// Abschluss-Notification — tippbar (öffnet den Cloud-Tab, payload
@@ -630,9 +635,18 @@ class SyncService {
/// Startet den Foreground-Service, damit der Sync auch bei Display-aus
/// und minimierter App weiterläuft (Android-Prozess-Garantie).
/// v2.55.3: Prüft POST_NOTIFICATIONS-Permission (Android 13+).
/// Ohne diese Permission crasht der Foreground-Service innerhalb von
/// 5 Sekunden (Android killt Services ohne sichtbare Notification).
Future<void> _starteForegroundService() async {
if (!Platform.isAndroid) return;
try {
// Android 13+: Benachrichtigungs-Berechtigung erforderlich
final status = await Permission.notification.status;
if (status.isDenied || status.isPermanentlyDenied) {
MeloLogger().aktion('foreground_sync_skip', {'grund': 'notification_denied'});
return;
}
final svc = FlutterBackgroundService();
final laeuft = await svc.isRunning();
if (!laeuft) {