simple_audio_kit 1.2.0
simple_audio_kit: ^1.2.0 copied to clipboard
A concise audio playback library for Flutter with playlists, caching, background controls, audio focus, and typed errors.
simple_audio_kit #
Simplified audio playback for Flutter. simple_audio_kit provides a clean,
generic API over proven plugins (just_audio, audio_session, and
audio_service) for music, podcasts, audiobooks, local files, assets, radio
streams, and sound effects.
Overview #
We handle the heavy lifting behind the scenes so that you can focus on building your app.
- Generic Audio Support: Handles network streams, local files, bundled Flutter assets, Android content URIs, and protected streams with custom HTTP headers.
- Offline Caching: Seamlessly cache network audio to local disk for instant offline playback and reduced network bandwidth.
- Versatile Audio Metadata: Supports titles, artists, album names, genres, artwork URLs, track duration, custom IDs, and arbitrary
extrasdata. - Configurable Audio Sessions: Tune device session behavior for music, speech/podcasts, or ambient sound effects using
AudioSessionConfiguration. - Multi-Player Support: Use the global
Audiofacade or instantiateSimpleAudioControllerfor independent concurrent players (e.g. playing background music + sound effects). - Minimal Integration: Playback state works from Dart; Android and iOS need the native background-audio setup shown below for system media controls.
- Audio Focus: Handles system interruptions (phone calls, navigation prompts) safely with automatic ducking and pausing.
Add the package to your pubspec.yaml:
dependencies:
simple_audio_kit: ^1.2.0
Then run:
flutter pub get
Platform support #
| Platform | Playback | Lock screen / notification controls | Offline Caching |
|---|---|---|---|
| Android | Yes | Yes — host setup required | Yes |
| iOS | Yes | Yes — host setup required | Yes |
| macOS | Yes | Yes | Yes |
| Web | Yes | Browser-dependent Media Session support | No package disk cache |
| Windows | Yes | No — runs headless | Yes |
| Linux | Yes | No — runs headless | Yes |
Disk caching uses the configured cache directory (the system temporary
directory by default), so the operating system may evict files. Supply
AudioCacheManager(customCacheDir: ...) when your app needs a specific
persistent location.
Background audio setup #
Background playback and system media controls require the host configuration
from audio_service. The
included example contains a working baseline:
- Android: add the internet, wake-lock, and foreground-service permissions,
register
AudioServiceandMediaButtonReceiver, and makeMainActivityextendAudioServiceActivity. Seeexample/android/app/src/main/AndroidManifest.xml. - iOS: add
audiotoUIBackgroundModes. Seeexample/ios/Runner/Info.plist. - macOS: sandboxed apps that stream network audio need the
com.apple.security.network.cliententitlement.
If system-media initialization fails, playback continues in headless mode and
an initFailed event is reported on Audio.errorStream.
Quick Start #
import 'package:flutter/material.dart';
import 'package:simple_audio_kit/simple_audio_kit.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize early. Calling init again updates session/cache settings.
await Audio.init();
runApp(const MyApp());
}
// 2. Play any audio anywhere!
Future<void> playAudio() async {
await Audio.play(
'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
title: 'Song Title',
artist: 'Artist Name',
album: 'Album Name',
cache: true, // Enables automatic offline disk caching!
);
}
Generic Audio Sources & Constructors #
AudioItem offers named constructors for different audio types:
// Network stream with disk caching enabled
final networkItem = AudioItem.network(
'https://api.example.com/stream.mp3',
title: 'Podcast Episode 1',
artist: 'Host Name',
cache: true, // Automatically saved to disk during playback
headers: {'Authorization': 'Bearer token'},
extras: {'episodeId': 101, 'chapter': 3},
);
// Local file audio
final fileItem = AudioItem.file(
'/storage/emulated/0/Download/audio.mp3',
title: 'Downloaded Track',
);
// Bundled Flutter asset
final assetItem = AudioItem.asset(
'assets/sounds/beep.mp3',
title: 'Notification Sound',
);
Offline Caching & Cache Management #
simple_audio_kit includes built-in offline caching powered by AudioCacheManager.
Enabling Caching #
You can enable caching per track or globally:
// 1. Enable per track
Audio.play('https://example.com/audio.mp3', cache: true);
// 2. Enable globally for all network tracks
await Audio.init(defaultCache: true);
Managing the Cache & Preloading Tracks #
Pre-download tracks in the background so they play instantly offline:
// Preload a track before the user hits play
await Audio.preload(networkItem);
// Check if a URL is already cached
final isCached = await Audio.isCached('https://example.com/audio.mp3');
// Get total disk space used by cached audio (in bytes)
final bytes = await Audio.getCacheSize();
// Delete specific cached item or clear the entire cache
await Audio.removeCached('https://example.com/audio.mp3');
await Audio.clearCache();
Configurable Audio Session Categories #
Configure the system audio session for music, speech (podcasts/audiobooks), or ambient sound effects during Audio.init():
// For Podcasts / Audiobooks (speech focus)
await Audio.init(
sessionConfiguration: const AudioSessionConfiguration.speech(),
);
// For Games or Ambient Apps
await Audio.init(
sessionConfiguration: const AudioSessionConfiguration.ambient(),
);
Calling Audio.init again reapplies the session configuration to the running
engine.
Multiple Audio Players #
For apps that need multiple independent players (e.g., playing background music while playing sound effects or comparing two audio tracks), instantiate SimpleAudioController directly:
final sfxPlayer = SimpleAudioController(
sessionConfiguration: const AudioSessionConfiguration.ambient(),
);
await sfxPlayer.init();
await sfxPlayer.play('asset:///assets/sfx/explosion.mp3');
// Dispose standalone controllers when their owner is removed.
await sfxPlayer.dispose();
Only the global Audio facade owns lock-screen and notification controls.
Standalone controllers intentionally run headless.
Full API Reference #
The Audio facade provides static access to all audio playback actions.
Core Playback #
Audio.init({AudioSessionConfiguration? sessionConfiguration, bool? defaultCache, AudioCacheManager? cacheManager}): Prepares or reconfigures the audio engine.Audio.play(...): Plays an audio track immediately with optional metadata, artwork, headers, extras, andcache: true.Audio.playList(List<AudioItem> items): Replaces the queue and starts its first valid item. An empty or wholly invalid list stops playback.Audio.pause(): Pauses the currently playing track.Audio.resume(): Resumes the paused track.Audio.stop(): Stops the audio session and closes background notifications.Audio.next()/Audio.previous(): Navigates the current queue.Audio.seek(Duration position): Seeks within the current item.Audio.setSpeed(double speed): Changes playback speed.Audio.setVolume(double volume): Sets volume from0.0to1.0.Audio.setRepeatMode(AudioRepeatMode mode): Selectsoff,one, orall.Audio.setShuffle(bool enable): Enables or disables queue shuffling.Audio.dispose(): Releases the engine.
Cache Control #
Audio.preload(AudioItem item): Pre-downloads a track into the disk cache.Audio.preloadUrl(String url, {Map<String, String>? headers}): Pre-downloads a URL directly.Audio.isCached(String url): Checks if a track is cached locally.Audio.getCacheSize(): Returns cache size in bytes.Audio.clearCache(): Clears all cached audio files.Audio.removeCached(String url): Removes a specific track from disk cache.Audio.cacheManager: Direct access to theAudioCacheManagerinstance.
Supported Schemes #
| Scheme | Example |
|---|---|
https / http |
https://example.com/track.mp3 |
file |
file:///storage/emulated/0/track.mp3 |
asset |
asset:///assets/beep.mp3 (or shorthand asset:assets/beep.mp3) |
content |
content://media/external/audio/media/42 (Android pickers) |
State Streams & Event Hooks #
Audio.playbackStateStream: Stream of state (playing,paused,stopped).Audio.playbackStateNow: Current playback state snapshot.Audio.positionStream: PositionDurationstream.Audio.bufferedPositionStream: Buffered position stream.Audio.isBufferingStream: Whether network data is buffering.Audio.durationStream: Total track length stream.Audio.speedStream/Audio.volumeStream: Current tuning values.Audio.currentItemStream: ActiveAudioItemstream.Audio.currentItemNow: Active item snapshot.Audio.queue: Unmodifiable list of accepted queue items.Audio.repeatModeStream/Audio.shuffleStream: Queue mode streams.Audio.errorStream: Stream ofSimpleAudioExceptions.Audio.onPlay,Audio.onPause,Audio.onComplete: Event callbacks.