Odeon Music Player is a lightweight music player for Android.

Overview

Odeon 🎵

Odeon Music Player is a lightweight music player for Android. Get it on Google Play.

We value your privacy, your battery life and your device's storage space.

Home screen Player controls Album list Album detail

Features

Odeon has all features that you'd expect from a music player in a clean and simple interface :

  • Browse your music by title, artists and albums.
  • Control playback via the interface, the lock screen or headset buttons.
  • Create and edit playlists.
  • Play tracks that have been added recently or the ones you like the most.
  • Control your music safely while driving with Android Auto 🚗 .

The following features are available but experimental :

  • Tell the Google Assistant 🎙️ what to play.
  • Enable Night Mode 🌛 to reduce eye-strain and save your battery life.

The project

Initially seen as a lightweight alternative to Google Play Music (the music player pre-installed on most Android phones), the idea behind Odeon gradually matured to become its own thing :

a smart music player that plays music matching your current mood.

At the time only the basic music player features are completed ; smart playlists are still under development.

Developer showcase

Odeon is built with the latest tools and practices for the Android Platform :

Odeon could then act as a showcase for developers wishing to integrate all those technologies together. It also demonstrates how to solve common Android problems such as animating icons and transitions between screens.

What's coming next

The following features are still under development :

  • Better management of user-defined playlists.
  • Build smart playlists whose tracks play well together.
  • Automatically tag media files to always have the correct album cover.

License

Copyright 2020 Thibault Seisel

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Alternative download source

    Alternative download source

    Thanks a lot for making your nice, light-weight and tracker-free app available as open source! Would you also consider making the APK available outside of Play Store – for those who cannot use it or rather avoid it for e.g. privacy reasons? Possibilities would e.g. be tagging your releases and attaching it there – or tagging and having your app built and included with F-Droid.

    opened by IzzySoft 9
  • Make app movable to SD card

    Make app movable to SD card

    Rationale

    Over 25% of the world's Android devices still run Android 6.0 or older [1]. This version of Android still has native support for moving applications to SD cards — this is crucial when dealing with low-storage devices. Many more recent OEM OSes also support moving applications to SD cards. This means making applications movable to the SD card is IMHO a rational choice.

    Solution

    Add android:installLocation="auto" flag to AndroidMainfest.xml. The default for Android is, curiously, not "auto" but "internalOnly"

    https://developer.android.com/guide/topics/data/install-location

    Signed-off-by: Atrate [email protected]

    opened by Atrate 4
  • Context menu on Tracks tab difficult to tap

    Context menu on Tracks tab difficult to tap

    The 3-dot context menu to the right of each track in the track tab is very difficult to tap without changing the position in the tracklist. I have tried multiple resolutions and still have the same issue. Trying to tap the dots quickly to add a track to a playlist usually results in scrolling down or up the tracklist rather than opening the menu.

    contextmenu

    I love this app! I am willing to contribute to development, I also have a feature I'd like to request/help implement.

    opened by rio-codes 3
  • Permanent crash on startup

    Permanent crash on startup

    On my phone Odeon crashes on every startup. Android 8.0.0. Storage permission given.

    [09-01 07:11:26.560 3363:4192 I/ActivityManager]
    START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=fr.nihilus.music/.HomeActivity bnds=[796,245][1053,593] (has extras)} from uid 10175
    
    [09-01 07:11:26.602 3363:4704 I/ActivityManager]
    Start proc 25383:fr.nihilus.music/u0a408 for activity fr.nihilus.music/.HomeActivity
    
    [09-01 07:11:28.887 3363:3385 I/LaunchCheckinHandler]
    Displayed fr.nihilus.music/.HomeActivity,cp,ca,2304
    
    [09-01 07:11:30.330 25383:25383 E/AndroidRuntime]
    FATAL EXCEPTION: main
    Process: fr.nihilus.music, PID: 25383
    m.b.a.o.u.c: Unexpected exception thrown by non-Glide code
    	at m.b.a.o.u.m$a.run(:9)
    	at android.os.Handler.handleCallback(Handler.java:789)
    	at android.os.Handler.dispatchMessage(Handler.java:98)
    	at android.os.Looper.loop(Looper.java:164)
    	at android.app.ActivityThread.main(ActivityThread.java:6592)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
    	at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:108)
    Caused by: android.content.res.Resources$NotFoundException: Drawable fr.nihilus.music:drawable/placeholder_track_icon with resource ID #0x7f0800b6
    Caused by: android.content.res.Resources$NotFoundException: File res/drawable/placeholder_track_icon.xml from drawable resource ID #0x7f0800b6
    	at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:792)
    	at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:614)
    	at android.content.res.Resources.getDrawableForDensity(Resources.java:876)
    	at android.content.res.XResources.getDrawableForDensity(XResources.java:868)
    	at android.content.res.Resources.getDrawable(Resources.java:818)
    	at android.content.res.XResources.getDrawable(XResources.java:790)
    	at m.b.a.o.w.e.a.a(:6)
    	at m.b.a.s.h.m(:3)
    	at m.b.a.s.h.r(:7)
    	at m.b.a.s.h.o(:4)
    	at m.b.a.o.u.m$a.run(:8)
    	at android.os.Handler.handleCallback(Handler.java:789)
    	at android.os.Handler.dispatchMessage(Handler.java:98)
    	at android.os.Looper.loop(Looper.java:164)
    	at android.app.ActivityThread.main(ActivityThread.java:6592)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
    	at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:108)
    Caused by: android.content.res.Resources$NotFoundException: Drawable fr.nihilus.music:color/color_on_surface_12_alpha with resource ID #0x7f060030
    Caused by: android.content.res.Resources$NotFoundException: File res/color/color_on_surface_12_alpha.xml from drawable resource ID #0x7f060030
    	at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:792)
    	at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:614)
    	at android.content.res.Resources.loadDrawable(Resources.java:885)
    	at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:953)
    	at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
    	at android.content.res.XResources$XTypedArray.getDrawable(XResources.java:1363)
    	at android.graphics.drawable.LayerDrawable.updateLayerFromTypedArray(LayerDrawable.java:382)
    	at android.graphics.drawable.LayerDrawable.inflateLayers(LayerDrawable.java:261)
    	at android.graphics.drawable.LayerDrawable.inflate(LayerDrawable.java:194)
    	at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
    	at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1295)
    	at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1254)
    	at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:779)
    	at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:614)
    	at android.content.res.Resources.getDrawableForDensity(Resources.java:876)
    	at android.content.res.XResources.getDrawableForDensity(XResources.java:868)
    	at android.content.res.Resources.getDrawable(Resources.java:818)
    	at android.content.res.XResources.getDrawable(XResources.java:790)
    	at m.b.a.o.w.e.a.a(:6)
    	at m.b.a.s.h.m(:3)
    	at m.b.a.s.h.r(:7)
    	at m.b.a.s.h.o(:4)
    	at m.b.a.o.u.m$a.run(:8)
    	at android.os.Handler.handleCallback(Handler.java:789)
    	at android.os.Handler.dispatchMessage(Handler.java:98)
    	at android.os.Looper.loop(Looper.java:164)
    	at android.app.ActivityThread.main(ActivityThread.java:6592)
    
    [09-01 07:11:30.335 3363:10030 W/ActivityManager]
      Force finishing activity fr.nihilus.music/.HomeActivity
    
    [09-01 07:11:30.353 3363:3379 I/ActivityManager]
    Showing crash dialog for package fr.nihilus.music u0
    
    [09-01 07:11:30.440 643:643 D/SFPerfTracer]
           layers: (4:14) (StatusBar#0 (0xaf483000): 0:1704696) (PieTriggerBOTTOM#0 (0xaf7c5000): 0:6053) (com.joko.wp.service.MyService#0 (0xaf64a000): 0:2098429)* (DimLayerController/Stack=0#0 (0xaf55a000): 0:2728)* (Sprite#0 (0xaf7a6000): 0:151)* (animation background stackId=1#0 (0xaf683000): 0:600)* (PieControlPanel#0 (0xaf7b0000): 0:1144)* (VoiceInteractionSession#0 (0xaf48d000): 0:568)* (InputMethod#0 (0xaf783000): 0:3733)* (NavigationBar#0 (0xaf644000): 0:713) (#0 (0xaf694000): 0:23)* (ch.deletescape.lawnchair.plah/ch.deletescape.lawnchair.Launcher#0 (0xaf797000): 0:131)- (Splash Screen fr.nihilus.music#0 (0xaf79e000): 0:36)- (fr.nihilus.music/fr.nihilus.music.HomeActivity#0 (0xaf499000): 1:68) 
    
    [09-01 07:11:30.840 3363:3378 W/ActivityManager]
    Activity pause timeout for ActivityRecord{30e4dbb u0 fr.nihilus.music/.HomeActivity t37640 f}
    
    [09-01 07:11:32.226 3363:10030 W/ActivityManager]
      Force finishing activity fr.nihilus.music/.HomeActivity
    
    [09-01 07:11:32.241 643:643 D/SFPerfTracer]
           layers: (7:14) (StatusBar#0 (0xaf483000): 0:1704696) (PieTriggerBOTTOM#0 (0xaf7c5000): 0:6053) (com.joko.wp.service.MyService#0 (0xaf64a000): 54:2098499) (DimLayerController/Stack=0#0 (0xaf55a000): 0:2738) (Sprite#0 (0xaf7a6000): 0:151)* (animation background stackId=1#0 (0xaf683000): 0:600)* (PieControlPanel#0 (0xaf7b0000): 0:1144)* (VoiceInteractionSession#0 (0xaf48d000): 0:568)* (InputMethod#0 (0xaf783000): 0:3733)* (NavigationBar#0 (0xaf644000): 0:713) (#0 (0xaf694000): 0:23)* (fr.nihilus.music/fr.nihilus.music.HomeActivity#0 (0xaf499000): 13:93)* (Application Error: fr.nihilus.music#0 (0xaf797000): 2:17) (ch.deletescape.lawnchair.plah/ch.deletescape.lawnchair.Launcher#0 (0xaf79e000): 7:12) 
    
    [09-01 07:11:32.268 3363:10030 I/ActivityManager]
    Killing 25383:fr.nihilus.music/u0a408 (adj 900): crash
    
    opened by DinoDevel 1
  • Build for version 2.0.2?

    Build for version 2.0.2?

    I just tried your music player out for the first time today, and I was really impressed! The interface is very functional, but also clean and simple (no fluff).

    I'm currently running Android 10 and noticed that artwork wasn't being displayed. I also noticed that version 2.0.2 appears to have a fix for this issue. Is there a reason you haven't published a build for version 2.0.2 yet?

    Thanks, Dan

    opened by danhansen 1
  • Apply modern Android UI best practices

    Apply modern Android UI best practices

    For a smoother transition to Jetpack Compose, the following changes were implemented:

    • replace usages of LiveData with StateFlow, that always provides an initial value
    • expose live state in ViewModels
    • replace MediaItem with dedicated UI models
    opened by thibseisel 0
  • Rework media sources

    Rework media sources

    Media sources have been reorganized to better follow Android Architecture best practices:

    • Split responsibilities of BrowserTree between BrowserTree and MediaSearchEngine
    • Move BrowserTree to media module
    • Drop MediaDao in favor of repositories for tracks, albums, artists and playlists
    opened by thibseisel 0
  • Extract Room database to dedicated core-database module

    Extract Room database to dedicated core-database module

    This should slightly reduce build times, avoiding invalidation of the whole project and running Room processor when anything shared in "core" module is changed.

    opened by thibseisel 0
  • Make fragments only depend on a single ViewModel

    Make fragments only depend on a single ViewModel

    Sharing ViewModels between multiple fragments makes it harder to reason about how components interact together. By dedicating a single ViewModel to each Fragment, each screen computes and retains its own state. State shared between multiple screens should be shared from the data layer.

    opened by thibseisel 0
  • (Dis)connect MediaBrowser based on ProcessLifecycleOwner

    (Dis)connect MediaBrowser based on ProcessLifecycleOwner

    ProcessLifecycleOwner is more suitable than ViewModel to manage the MediaBrowser connection lifecycle. ViewModel keeps MediaBrowser connected until Activity is destroyed, ProcessLifecycleOwner disconnects whenever the app moves to the background, which is more efficient.

    opened by thibseisel 0
  • Migrate to Gradle convention plugin

    Migrate to Gradle convention plugin

    Sharing configuration between Gradle modules is better done using a Gradle convention plugin. This was previously done using cross-project configuration.

    opened by thibseisel 0
  • Crashing due to loading not played music when installed #bug

    Crashing due to loading not played music when installed #bug

    This happened when I installed it on my Galaxy J7 Star - Android 9.

    It was so annoying that I uninstall multiple times and installing it multiple times over and over again.

    opened by ian1ilych 0
  • Data loss on double screen rotation

    Data loss on double screen rotation

    • When executing this sequence of actions, there is a loss of data in the activity HomeActivity:
    1. KeyEvent(name=BACK)
    2. IntentEvent(intent='am start fr.nihilus.music/fr.nihilus.music.HomeActivity')
    3. TouchEvent [[540,152],[720,236]]
    4. TouchEvent [[360,152],[540,236]]
    5. TouchEvent [[565,61],[649,145]]
    6. TouchEvent [[628,71],[712,155]]
    7. SetTextEvent [[134,64],[628,162]]
    8. ScrollEvent(direction=FULL_LEFT)
    9. ScrollEvent(direction=UP) [[0,236],[720,1558]]
    10. Cap01: capture screen properties before rotation
    11. DoubleRotationEvent
    12. Cap02: capture screen properties after rotation
    13. Cap01 != Cap02 (focus variable changes state)
    • HomeActivity: the pop-up menu disappears
    Before and after double screen rotation

    A data loss problem occurs when data is accidentally deleted or state variables are accidentally assigned with default or initial values. This issue is related to the activity's lifecycle (1). When a screen rotation occurs, the activity is destroyed and resumed. Data loss will happen if the developer does not save the variables before the destruction and restore them after creation. To avoid this, the developers have to implement both the logic necessary to save the activity state in the onSaveInstanceState() callback method and the logic to resume its state in the onRestoreInstanceState() callback method. Another way to avoid data loss problems is to use the view model, designed to store and manage UI-related data in a lifecycle-conscious way (2).

    Note:

    • Double screen rotation: It is executed twice to reach a state that should be exactly the same as the screen before if no data loss occurred.
    • A data loss problem occurs when data is accidentally deleted or state variables are accidentally assigned with default or initial values.
    1. https://developer.android.com/guide/components/activities/activity-lifecycle
    2. https://developer.android.com/topic/libraries/architecture/viewmodel
    opened by davirec 2
  • Album

    Album "Play" button is confusing

    Hi,

    first of all thank you very much for your awesome app! Excellent work! Now to my problem... I find it very confusing that when you open an album and hit the play button in the bottom right corner of the album cover it starts playing a random song from the album instead of the first song in the list. (Shuffle is deactivated) Also is there a way to see the current titles of the playlist? When I started playing an album and then leave the album page I still can iterate through the album's song using the next and previous buttons, but can't see the list of songs in the playlist?

    Thanks!

    opened by CramericaIndustries 2
  • Feature Request: Import ERC-721 token (NFT) Music Tracks from User's Wallet

    Feature Request: Import ERC-721 token (NFT) Music Tracks from User's Wallet

    User Journey

    This feature request is for a new user journey, described thus:

    as a user of Odeon, I want to be able to connect Odeon with my Wallet, and show my ERC-721 tokens (NFTs) (audio tracks, playlists).

    Odeon

    Below is a screenshot of the existing Odeon music player app:

    Screenshot_20210830-183319_Odeon

    Music for the player is currently served from the device's own filesystem.

    Proposed Architecture

    Components

    An architecture to enable this can include the following components:

    • WalletConnect is a protocol for connecting to Wallet Apps on a device. This allows a user to transact on an Ethereum Virtual Machine (EVM)-compatible blockchain.

    • Optimism is an EVM-compatible blockchain-based network, used for minting and transferring ERC-721 tokens (NFTs).

    • IPFS is a distributed file system, used for storing files, such as mp3 audio files, and JSON metadata files.

    Approach

    Odeon could:

    1. Connect with the wallet app on the user's device using WalletConnect
    2. Read / write ERC-721 token (NFT) data from / to Optimism
    3. Retrieve audio files and metadata content from IPFS
    4. Play audio
    5. (Advanced feature) to cache audio tracks on your device for offline playback.

    Additional Thoughts

    Implementation

    This kind of functionality can very easily extend the existing excellent UX that Odeon already has.

    For example, a "Connect Wallet" (step 1) option can live in the main Hamburger underneath "Settings", or even in "Settings". It need only require a few steps in the app to "Connect Wallet", and WalletConnect makes this veery easy!

    Odeon Connect Wallet

    Everything else can happen in the background... pulling in metadata and audio files (steps 2 and 3 above). It may perhaps need some extension in order to stream content from an IPFS gateway though.

    As for playback (step 4), Odeon's existing audio player UI is more than capable of this.

    For the advanced feature, a "Keep for Offline" checkbox for each track can live beneath "Add to playlist" and "Delete" in the options for each track:

    Keep for Offline

    "Delete" might need to be disabled for NFT audio tracks because it's not really possible to "delete" from IPFS.

    Future Features

    Future features could include:

    • Publish new playlists as NFTs to store in your wallet, or to send to your friends' wallets
    • Publish new original music as NFTs to send to music collectors.

    Notes

    I accept that this may appear a somewhat esoteric concept to propose. But I believe it to be based in a very sane context.

    The world is very slowly coming to terms with jpeg NFTs, indicating clearly that gif, then mp3 then mp4 will follow.

    NFTs for Music are emerging, as evidenced by Jonathan Mann's recent release "Right Click Save As".

    Further, zero-knowledge rollup networks such as Optimism, Arbitrum and zksync are substantially increasing the capacity of blockchain networks, meanwhile reducing their cost of use.

    And finally, IPFS is emerging as the default go-to storage for decentralised content and metadata, and while still maturing in some aspects, it represents a sustainable part of the architecture. This is especially true in light of the progress made by Filecoin project.

    Credits

    All the credit goes to you for reading all this. Bravo to you!

    opened by chrishobcroft 3
  • Android Auto - Albums view doesn't load

    Android Auto - Albums view doesn't load

    All views work on the phone itself and the Artist view loads ok but the Album view just has a spinner and never loads. I have the same issue in a car and also via the AA emulator. Any way of fixing this or suggestions? My library is about 30k files

    opened by CaptainKarma 0
Releases(2.1.0)
Owner
Thibault Seisel
I'm a fullstack developer specialized in Android applications, JVM backends and Web front-end. Kotlin enthusiast.
Thibault Seisel
SocyMusic is an open-source Android music player written in Java with the aim of creating an easy-to-use app for exchanging and listening to top-quality music. Help us create it!

SocyMusic SocyMusic is an open-source Android music player written entirely in Java. It's objectives are to provide top-quality music to everyone for

Benji 23 Dec 26, 2022
Blade is an open source music player for Android, allowing you to play music from multiple services : files on your phone, Spotify, and more.

Blade Player Blade is an open source music player for Android, allowing you to play music from multiple services : files on your phone, Spotify, and m

Valentin HAUDIQUET 72 Jan 5, 2023
Echo is a lightweight and minimal music player for Android, built with Android Studio and written in Kotlin

Echo - Echo, A light-weight, minimal music player for Android, with shuffle, favorites and audio visualization

Divins Mathew 0 Feb 7, 2022
TunePlayer is a basic music player app aimed at showing how MusicServiceCompat and MusicBrowerCompat can be used to build a music playback service

TunePlayer TunePlayer is a basic music player app aimed at showing how MusicServiceCompat and MusicBrowerCompat can be used to build a music playback

Abdulmalik 6 Nov 18, 2022
This is a local music player, imitates the UI of Netease Music client.

Introduce This is a local music player, imitates the UI of Netease Music client. The UI was built on Jetbrains Compose. Screenshot Features Parse and

Konyaco 4 Dec 10, 2022
This is a local music player, imitates the UI of Netease Music client.

Introduce This is a local music player, imitates the UI of Netease Music client. The UI was built on Jetbrains Compose. Screenshots Features Parse and

Konyaco 4 Dec 10, 2022
Auxio is a local music player with a fast, reliable UI/UX without the many useless features present in other music players

Auxio A simple, rational music player for android. FAQ | Licenses | Contributing | Architecture About Auxio is a local music player with a fast, relia

null 3 Mar 21, 2022
Lightweight and Material designed Music Player

Music Player Lightweight and Material designed Music Player Based on Phonograph Features: Settings: Active tabs management Themes: Light, Dark, Black

Max 273 Dec 11, 2022
Android music player example.

Android music player example.

Chien 21 Jul 29, 2022
A elegant and light weight music player for android

A elegant and light weight music player for android

Atul Patare 45 Dec 21, 2022
Best material design music player for Android

Metro Material Design music player for Android music lovers Table of contents Downloads Differences between Metro and RetroMusicPlayer Screenshots App

Muntashir Al-Islam 684 Jan 1, 2023
Shuttle is an open source, local music player for Android.

Shuttle Music Player Shuttle is an open source, local music player for Android. Shuttle comes in two flavours: Shuttle (free) Shuttle+ The free versio

Tim Malseed 2.2k Jan 4, 2023
A material designed music player for Android

Vinyl Music Player A material designed local music player for Android. Forked from Phonograph; makes all Pro features free, as they used to be. Additi

Adrien Poupa 581 Dec 30, 2022
Auxio - A simple, rational music player for android.

Auxio is a local music player with a fast, reliable UI/UX without the many useless features present in other music players. Built off of Exoplayer, Auxio has a much better listening experience compared to other apps that use the native MediaPlayer API. In short, It plays music.

OxygenCobalt 800 Jan 2, 2023
An offline music player android app, with modern UI and powerful features

Pulse Music An offline music player android app, with modern UI and powerful features If you liked this repo, fork it and leave a STAR. Your support m

Sharath 7 Apr 11, 2022
Android Offline Music Player

Howl Music Player A sleek and minimal offline music player made wit. Features Sleek and responsive UI , following material design Minimal layout with

LooKeR 145 Jan 8, 2023
A simple music player for Android

RSShool2021-Android-task6-Music-App Цель - реализовать простой музыкальный плеер на Android ?? Требования: Данные о треках считываются с JSON-файла. П

null 0 Dec 19, 2021
Another local music player for Android built with Compose. Way too "local" so you likely won't need it.

AnotherAndroidLocalMusicPlayer Another local music player for Android built with Compose and media3 (ExoPlayer). Warning The app behaves strangly as i

oO0oO0oO0o0o00 0 Mar 13, 2022
Music player for android.

Features ?? Geet is an music player application to play songs in local storage of device. Songs are played in a queue. Queued songs can be deleted or

Jay Mistry 2 Jun 13, 2022