Meloplay is a local music player app that plays music from your device built with Flutter.
- Android only
- Play music from your device
- Background audio
- Notification controls
- Lock screen controls
- Play, pause, skip, previous, seek
- Shuffle and repeat
- Search for music, artists, albums, genres
- Sort by (title, artist, album, duration, date, size, etc)
- Order by (ascending, descending)
- Playlists (Read, create, rename, delete, add songs, remove songs)
- Queue (List, add songs, remove songs, change order)
- Favorites (Add songs, remove songs)
- Recently played
- Most played
- Artists
- Albums
- Genres
- Lyrics
- Equalizer
- Sleep timer
- Share music
- Settings
- Themes (multiple themes)
- Localization
| Splash | Songs | Player |
|---|---|---|
![]() |
![]() |
![]() |
| Playlists | Artists | Albums |
|---|---|---|
![]() |
![]() |
![]() |
| Genres | Drawer | Themes |
|---|---|---|
![]() |
![]() |
![]() |
| Artist | Album | Genre |
|---|---|---|
![]() |
![]() |
![]() |
| Search | Settings | Scan |
|---|---|---|
![]() |
![]() |
![]() |
| Name | Description |
|---|---|
| auto_size_text | Flutter widget that automatically resizes text to fit perfectly within its bounds. |
| bloc | A predictable state management library. |
| flutter_bloc | Flutter widgets that make it easy to implement BLoC design patterns. |
| flutter_cache_manager | A Flutter plugin for caching images and other resources. |
| flutter_staggered_animations | A plugin for adding staggered animations to your Flutter apps. |
| flutter_svg | Flutter plugin for displaying SVG images. |
| fluttertoast | Flutter plugin for displaying toast messages. |
| get_it | Simple Service Locator for dependency injection. |
| hive | A lightweight and blazing fast key-value database. |
| hive_flutter | Hive database implementation for Flutter. |
| just_audio | A feature-rich audio player for Flutter. |
| just_audio_background | Plugin for playing audio in the background on Android and iOS. |
| lottie | Library for rendering JSON-based Lottie animations natively. |
| marquee | A Flutter widget that scrolls text infinitely. |
| on_audio_query | A Flutter plugin to query songs on Android and iOS. |
| package_info_plus | Plugin for querying information about the application package. |
| permission_handler | Cross-platform permission handling plugin. |
| share_plus | Plugin for sharing content via the platform share UI. |
| url_launcher | Plugin for launching URLs on mobile platforms. |
- Flutter
- Android Studio / Xcode
-
Clone the repo
git clone
-
Install dependencies
dart pub get
-
Run the app
flutter run
Inside AndroidManifest.xml we have the following permissions:
<!-- ADD xmlns:tools="http://schemas.android.com/tools" to the "manifest" element -->
<manifest xmlns:tools="http://schemas.android.com/tools" ...>
<!-- url_launcher -->
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https" />
</intent>
</queries>
<!-- Android 12 and below -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- Android 13+ -->
<uses-permission
android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- ADD THESE TWO PERMISSIONS -->
<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 ...>
...
<!-- EDIT THE android:name ATTRIBUTE IN YOUR EXISTING "ACTIVITY" ELEMENT -->
<activity android:name="com.ryanheise.audioservice.AudioServiceActivity" ...>
...
</activity>
<!-- ADD THIS "SERVICE" element -->
<service android:name="com.ryanheise.audioservice.AudioService"
android:foregroundServiceType="mediaPlayback"
android:exported="true" tools:ignore="Instantiatable">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
<!-- ADD THIS "RECEIVER" element -->
<receiver android:name="com.ryanheise.audioservice.MediaButtonReceiver"
android:exported="true" tools:ignore="Instantiatable">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
</application>
</manifest>Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Distributed under the Attribution-NonCommercial-ShareAlike 4.0 International License. See LICENSE for more information.
Give a star if you like this project!














