import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; /// Fragt die zum Lesen der Musik nötige Berechtigung an und meldet, ob erteilt. /// - Android 13+ (API 33): READ_MEDIA_AUDIO /// - Android < 13: READ_EXTERNAL_STORAGE /// - iOS / Desktop: kein Laufzeit-Grant nötig (Sandbox bzw. vom Nutzer gewählte /// Ordner sind bereits freigegeben). Future ensureAudioPermission() async { if (!Platform.isAndroid) return true; final info = await DeviceInfoPlugin().androidInfo; final permission = info.version.sdkInt >= 33 ? Permission.audio : Permission.storage; final status = await permission.request(); return status.isGranted; } /// Öffnet die System-Einstellungen der App (für dauerhaft verweigerte Rechte). Future openMusicPermissionSettings() => openAppSettings(); /// Ob für die Wiedergabe-Benachrichtigung eine Laufzeit-Berechtigung nötig ist. /// Erst ab Android 13 (API 33) gibt es POST_NOTIFICATIONS; davor erscheint die /// Benachrichtigung ohne Nachfrage, und ein Antrag liefe ins Leere. bool brauchtBenachrichtigungsRecht({ required bool istAndroid, required int sdkInt, }) => istAndroid && sdkInt >= 33; /// Fragt das Recht an, die Wiedergabe-Benachrichtigung zu zeigen. /// /// Ohne dieses Recht läuft die Wiedergabe auf Android 13+ zwar weiter, aber /// Benachrichtigung und die Bedienknöpfe darin fehlen vollständig — die /// Steuerung ist dann nur noch in der geöffneten App erreichbar. Future ensureNotificationPermission() async { if (!Platform.isAndroid) return true; final info = await DeviceInfoPlugin().androidInfo; if (!brauchtBenachrichtigungsRecht( istAndroid: true, sdkInt: info.version.sdkInt, )) { return true; } final status = await Permission.notification.request(); return status.isGranted; }