I'm encountering the following error after adding the just_audio_background package to my Flutter project:
`E/flutter (13120): [ERROR:flutter/runtime/dart_vm_initializer(40)] Unhandled Exception: PlatformException(The Activity class declared in your AndroidManifest.xml is wrong or has not provided the correct FlutterEngine. Please see the README for instructions., null, null, null)`
I have tried several fixes (including suggestions from documentation and various AI models), but nothing seems to work. Below are the relevant parts of my project:
<manifest xmlns:android=";>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- ALSO ADD THIS PERMISSION IF TARGETING SDK 34 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
<application
android:label="apd_killer"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2"/>
</application>
<!-- Required to query activities that can process text -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
in paml :
dependencies:
flutter:
sdk: flutter
just_audio: ^0.9.42
just_audio_background: ^0.0.1-beta.15
permission_handler: ^11.3.1
# ... other dependencies
MainActivity.kt:
package com.example.apd_killer
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()
**main.dart : **
import 'package:apd_killer/preferences_manager.dart';
import 'package:apd_killer/screens/preparation_screen.dart';
import 'package:apd_killer/screens/home_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:just_audio_background/just_audio_background.dart';
import 'package:permission_handler/permission_handler.dart';
import 'screens/disclaimer_screen.dart';
import 'screens/sound_therapy_screen.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// await requestPermissions(); // Request permissions before app starts
await PreferencesManager().init(); // Initialize PreferencesManager
PreferencesManager().enableLogs(); // enableLogs() or disableLogs()
await JustAudioBackground.init(
androidNotificationChannelId: 'com.example.apd_killer',
androidNotificationChannelName: 'Audio playback',
androidNotificationOngoing: true,
);
runApp(const ProviderScope(child: AudioCardioApp()));
}
class AudioCardioApp extends StatelessWidget {
const AudioCardioApp({super.key});
Future<Widget> _getInitialScreen() async {
await requestPermissions();
// Use PreferencesManager to retrieve preferences
bool disclaimerAccepted = PreferencesManager().getDisclaimerAccepted();
bool assessmentDone = PreferencesManager().getAssessmentDone();
if (assessmentDone == true) {
return HomeScreen();
} else if (disclaimerAccepted == true) {
return const PreparationScreen();
} else {
return const DisclaimerScreen();
}
}
@override
Widget build(BuildContext context) {
return FutureBuilder<Widget>(
future: _getInitialScreen(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const MaterialApp(
home: Scaffold(
body: Center(child: CircularProgressIndicator()),
),
);
} else if (snapshot.hasData) {
return MaterialApp(
title: 'AudioCardio',
theme: ThemeData(
colorScheme: ColorScheme(
brightness: Brightness.light,
primary: Colors.blue,
onPrimary: Colors.white,
secondary: Colors.orange,
onSecondary: Colors.white,
error: Colors.red,
onError: Colors.white,
surface: Colors.grey[200]!,
onSurface: Colors.black,
),
),
home: snapshot.data!,
);
} else {
return const MaterialApp(
home: Scaffold(
body: Center(child: Text('Error loading initial screen')),
),
);
}
},
);
}
}
// Permission handling function
Future<void> requestPermissions() async {
await Permission.microphone.request();
await Permission.notification.request();
// Request foreground service permission for Android 12+
if (await Permission.manageExternalStorage.request().isGranted) {
// await Permission.foregroundService.request();
}
}
Error Log:
Running Gradle task 'assembleDebug'... 37.9s
√ Built build/app/outputs/flutter-apk/app-debug.apk
Installing build/app/outputs/flutter-apk/app-debug.apk... 21.6s
I/flutter (13120): [IMPORTANT:flutter/shell/platform/android/android_context_vk_impeller(60)] Using the Impeller rendering backend (Vulkan).
I/flutter (13120): [IMPORTANT:flutter/shell/platform/android/android_context_vk_impeller(60)] Using the Impeller rendering backend (Vulkan).
E/flutter (13120): [ERROR:flutter/runtime/dart_vm_initializer(40)] Unhandled Exception: PlatformException(The Activity class declared in your AndroidManifest.xml is wrong or has not provided the correct FlutterEngine. Please see the README for instructions., null, null, null)
E/flutter (13120): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:646:7)
E/flutter (13120): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:334:18)
E/flutter (13120): <asynchronous suspension>
E/flutter (13120): #2 MethodChannelAudioService.configure (package:audio_service_platform_interface/method_channel_audio_service.dart:14:5)
E/flutter (13120): <asynchronous suspension>
E/flutter (13120): #3 AudioService.init (package:audio_service/audio_service.dart:1015:5)
E/flutter (13120): <asynchronous suspension>
E/flutter (13120): #4 _JustAudioBackgroundPlugin.setup (package:just_audio_background/just_audio_background.dart:97:21)
E/flutter (13120): <asynchronous suspension>
E/flutter (13120): #5 JustAudioBackground.init (package:just_audio_background/just_audio_background.dart:53:5)
E/flutter (13120): <asynchronous suspension>
E/flutter (13120): #6 main (package:apd_killer/main.dart:17:3)
E/flutter (13120): <asynchronous suspension>