From e18f4195b9d975420fa7ffb68982cf95ca572657 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Mon, 18 May 2026 17:29:24 +0300 Subject: [PATCH] fix: resolve DarwinAudioError on iOS using temporary .mp3 extension and upgrade mock Voice Note base64 to valid silent MP3 --- whatsapp_app/lib/screens/chat_screen.dart | 8 ++++---- whatsapp_app/lib/widgets/message_bubble.dart | 12 +++++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/whatsapp_app/lib/screens/chat_screen.dart b/whatsapp_app/lib/screens/chat_screen.dart index d42ab81..1651e20 100644 --- a/whatsapp_app/lib/screens/chat_screen.dart +++ b/whatsapp_app/lib/screens/chat_screen.dart @@ -257,12 +257,12 @@ class ChatScreen extends StatelessWidget { label: 'Voice Note', onTap: () { Get.back(); - // Real WhatsApp voice note Ogg/Opus snippet base64 - const base64Audio = 'T2dnUwACAAAAAAAAAABkAAAAAAAAADI5MFABE09wdXNIZWFkAQE4AYA+AAAAAABPZ2dTAAAAAAAAAAAAAGQAAAABAAAAWxHrFgEYT3B1c1RhZ3MIAAAAV2hhdHNBcHAAAAAAT2dnUwAAuFIBAAAAAABkAAAAAgAAAMW1RVAcs/8S/xf/C/8W/1X/K/9E/xn/HNH/Dv8P/z3/PEuGBwgTMC0L5ME27MWAB8lyJ+FE6lCAAoCJwmN8nmEoWpnN+vTMmxKRivTjVzyKgC8kq+xU2t9BmYsnP6PiOVb9FSBIclbkE+UQqmpijsWqPKSgqfrb/axQjKz+XqwPUt2yyxIoWNB7gp/NUv8QB8AEzwy9Jb9ZFBPoQ8UljPRzhbjRp8YCjZxOxxP5eLIUrPxlftPv1tu98HUPVsf7zjtZczAbrMtZ7S8RP/BBveWrUZRAS4YvLiwpK45K82R2giPnAouP77D0aXkd3aEek/leJE7lRwH4oHyI0kPXsUbT9kNKi6g7c3SAjqK2HFw8qYXpIaL'; + // 100% valid MP3 silent audio base64 snippet to prevent getAudioDuration errors + const base64Audio = 'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA/+M4wAAAAAAAAAAAAEluZm8AAAAPAAAAAwAAAbAAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV////////////////////////////////////////////AAAAAExhdmM1OC4xMwAAAAAAAAAAAAAAACQDkAAAAAAAAAGw9wrNaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+MYxAAAAANIAAAAAExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxDsAAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxHYAAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'; ctrl.sendMediaMessage( base64Audio, - 'audio/ogg', - 'voice_note.ogg', + 'audio/mp3', + 'voice_note.mp3', ); }, ), diff --git a/whatsapp_app/lib/widgets/message_bubble.dart b/whatsapp_app/lib/widgets/message_bubble.dart index 67e3c43..fbdb06f 100644 --- a/whatsapp_app/lib/widgets/message_bubble.dart +++ b/whatsapp_app/lib/widgets/message_bubble.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:get/get.dart'; @@ -210,7 +211,16 @@ class _InteractiveMediaWidgetState extends State { await _player.pause(); } else { final bytes = base64Decode(base64Data); - await _player.play(BytesSource(bytes)); + // Clean special characters from ID to construct a safe filename + final safeId = widget.message.id.replaceAll(RegExp(r'[^a-zA-Z0-9]'), ''); + final tempDir = Directory.systemTemp; + final tempFile = File('${tempDir.path}/voice_$safeId.mp3'); + + if (!await tempFile.exists()) { + await tempFile.writeAsBytes(bytes); + } + + await _player.play(DeviceFileSource(tempFile.path)); } } catch (e) { print('[AUDIO PLAYBACK ERROR] $e');