[MOD] Spotify app with AVRCP bluetooth metadata

Search This thread

Nightwish76

New member
Nov 13, 2013
3
0
I have also tried the Metafy app as well, still don't get any metadata to my car. Am o doing anything wrong


Sent from my Sony Xperia™ Z1 using Tapatalk
 

Citoyen

New member
Nov 29, 2013
1
0
Got the same problem, no metadata on my golf 7 highline... But if I play music with the stock music app and switch back to spotify suddenly the metadata are sent. Sadly the notify app does not help for me.

Anybody got a solution for that awkward problem?
 

rsalas187

Senior Member
Jul 20, 2009
235
32
@DanMc85 , Can you patch the latest version of Spotify? Plz! :) Nothing else is working on my S4 and AVH head unit after my 4.3 upgrade. The Old versions kills bluetooth.
 
Last edited:

DanMc85

Senior Member
Jan 6, 2008
631
264
USA
@DanMc85 , Can you patch the latest version of Spotify? Plz! :) Nothing else is working on my S4 and AVH head unit after my 4.3 upgrade. The Old versions kills bluetooth.

I will patch the version that was just released tomorrow when I get home from work... however, no fix has been found yet for 4.3 Samsung devices, so you may still have issues as the patch will still be based on the existing code but I will post it for others not using a Samsung device to benefit from.

- Dan
 

rooobbbbb

Senior Member
Apr 13, 2008
71
66
I will patch the version that was just released tomorrow when I get home from work... however, no fix has been found yet for 4.3 Samsung devices, so you may still have issues as the patch will still be based on the existing code but I will post it for others not using a Samsung device to benefit from.

- Dan

Very much looking forward to it. I'm on 4.4 so the old versions have no album art for me. I'm also using ART so I can't use the xposed module and metafy is way too slow and unreliable to bother with. I'd definitely be willing to donate something for an update. Thanks for your past versions. Been using them on other devices for quite some time now.
 

DanMc85

Senior Member
Jan 6, 2008
631
264
USA
Very much looking forward to it. I'm on 4.4 so the old versions have no album art for me. I'm also using ART so I can't use the xposed module and metafy is way too slow and unreliable to bother with. I'd definitely be willing to donate something for an update. Thanks for your past versions. Been using them on other devices for quite some time now.

Thanks for the reminder... I just uploaded the new version, let me know how it works. I have a Samsung Galaxy Note 3 so I am unable to test as it crashes bluetooth on samsung 4.3 devices.
 
  • Like
Reactions: carltonbiscuit

carltonbiscuit

New member
Jul 15, 2013
1
0
audio ducking

DanMc85,

Thank you so much for this!! The state of the Android Spotify app is pretty sad and I don't see it changing anytime soon (there have been threads requesting this on their forms for years).

The only other feature I really want and don't expect to ever get is audio ducking (lowering the volume when you get a notification or your GPS alerts you of a turn similar to how iOS or Google Music acts instead of simply stopping the music, which is really annoying). Apparently using "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK" allows Android apps to lower volume during a brief loss of focus. I was wondering if you know of anyway to modify the spotify apk to do this as well. There is more info on this function here: developer.android.com/reference/android/media/AudioManager.html

I attempted to add this, and I've got the apk decompiled but that itself stretches the limits of my knowledge and I have no idea where I would put this command inside the app.

Regardless, thank you for picking up the Spotify slack and providing continued updates!
 

capelstmary

Member
Feb 10, 2013
6
1
Gave up waiting for Spotify

Gave up waiting for Spotify to officially respond and signed up to Deezer at half price for 6 months. Everything worked straight away!
 

ender323

Member
Oct 20, 2012
5
1
App is working on my ATT Galaxy S4 running 4.3. However, bluetooth shuts down every minute or so-it reconnects, but its a pain. Any troubleshooting advice would be greatly appreciated. Other than that bug, its great work, thank you!
 

TT_Vert

Senior Member
Sep 11, 2010
1,822
234
App is working on my ATT Galaxy S4 running 4.3. However, bluetooth shuts down every minute or so-it reconnects, but its a pain. Any troubleshooting advice would be greatly appreciated. Other than that bug, its great work, thank you!
Are you getting an error when the Bluetooth disconnects? I get a Bluetooth error when I open this apk on the note 3 running 4.3 whereas the note 2 never gave this. I assume its normal and hopefully there will be a fix for a different apk..

Dave
 

Top Liked Posts

  • There are no posts matching your filters.
  • 30
    Spotify App with Bluetooth metadata (i.e. album , title , artist ) modification.
    Attached is current version @ 4/1/12 (v0.5.4.73) - works perfectly with my Subaru Bluetooth, let me know how you go.

    Installation Instructions (from fayez @ spotify):
    NOTE: you will have to redownload your music (this may be prevented by manually copying the apk)
    1. Download the .apk file and get it onto your phone (you don't need the AVRCP zip file at all - it's for reference only)
    2. Uninstall your current version of Spotify
    3. Install the custom .apk (you may need to turn on the ability to install from unknown sources first... It's in Settings > Security for me... Make sure to turn it off afterward)
    4. Launch the app and log back into your Spotify account and enjoy.

    You won't receive update reminders from the Play store, but will need to check manually (if you do see one, let me know so I can patch it. )


    Original Post:
    Hi guys,
    I've been trying to modify the Spotify app so that the title, album and artist information shows up over bluetooth with AVRCP. I found a really helpful site with a patch/diff file showing the smali changes that need to be made. I've had a crack, but I think the current version of Spotify is different to the one the patch was made for.

    the patch is set to make changes to one smali file (ad.smali) (smali/com/spotify/mobile/android/service/ad.smali)

    however the important parts of that file are now in x.smali (smali/com/spotify/mobile/android/service/x.smali)

    Any guidance/help would be appreciated. It frustrates me how my car stereo doesn't show up any useful information (even though it does with the stock music app)

    I've attached the original smali, my attempt as well as the patch file.


    Sources:
    https://github.com/loganakamatsu/SpotifyAVRCP
    24
    Spotify - Bluetooth Metadata Mod - 0.7.1.399

    I modded the newest 0.7.1.399 version of Spotify released October 11, 2013... it is working great with my Pioneer AVH-P8400BT Headunit in my car.

    Since it isn't signed with Spotify's encryption keys and it is using a generic android testkey it will not let you login with facebook. If you currently can only use Facebook to sign in, go to this Spotify page and get yourself a real username and password to use for login: https://www.spotify.com/us/account/set-device-password/

    Let me know if there are any issues with the modded apk, it is attached at the bottom of this post. Make sure you have your android device set to allow application installations from Unknown Sources enabled, otherwise it will not install.

    I recommend to clear Spotify data and uninstall any previous Spotify version before installing this one to make sure there are no lurking issues.

    This mod will NOT give you Bluetooth Metadata Info if you are running CyanogenMod or any other AOSP version of android as AVRCP is not supported on these versions at this time. However, it should work if you have a device with the new android 4.3 even if it is AOSP.... I have been told about issues, including discovering myself, that this mod currently is not working on the Samsung Galaxy Note III.
    ______

    For those interested:

    Here is the complete de-compiled and modded ...\smali\com\spotify\mobile\android\service\ag.smali file with the changes to support Bluetooth Metadata:

    Code:
    .class public final Lcom/spotify/mobile/android/service/ag;
    .super Ljava/lang/Object;
    .source "SourceFile"
    
    # interfaces
    .implements Lcom/spotify/mobile/android/util/bf;
    
    
    # instance fields
    .field private a:Landroid/app/Service;
    
    .field private b:Lcom/spotify/mobile/android/util/bb;
    
    
    # direct methods
    .method public constructor <init>(Landroid/app/Service;Lcom/spotify/mobile/android/util/bb;)V
        .locals 0
        .parameter
        .parameter
    
        .prologue
        .line 20
        invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    
        .line 21
        iput-object p1, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        .line 22
        iput-object p2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        .line 23
        return-void
    .end method
    
    
    # virtual methods
    .method public final a()V
        .locals 1
    
        .prologue
        .line 26
        iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v0, p0}, Lcom/spotify/mobile/android/util/bb;->a(Lcom/spotify/mobile/android/util/bf;)V
    
        .line 27
        return-void
    .end method
    
    .method public final a(I)V
        .locals 0
        .parameter
    
        .prologue
        .line 35
        invoke-virtual {p0}, Lcom/spotify/mobile/android/service/ag;->c()V
    
        .line 36
        return-void
    .end method
    
    .method public final b()V
        .locals 6
    
        .prologue
        const/4 v5, 0x0
    
        const/4 v4, 0x0
    
        .line 30
        iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v0, p0}, Lcom/spotify/mobile/android/util/bb;->b(Lcom/spotify/mobile/android/util/bf;)V
    
        .line 31
        new-instance v0, Landroid/content/Intent;
    
        const-string v1, "android.appwidget.action.APPWIDGET_UPDATE"
    
        invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
    
        new-instance v1, Landroid/content/ComponentName;
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        const-class v3, Lcom/spotify/mobile/android/ui/widget/SpotifyWidget;
    
        invoke-direct {v1, v2, v3}, Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
    
        invoke-virtual {v0, v1}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
    
        const-string v1, "track_uri"
    
        invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v1, "track_name"
    
        invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v1, "artist_name"
    
        invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v1, "album_name"
    
        invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v1, "paused"
    
        const/4 v2, 0x1
    
        invoke-virtual {v0, v1, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        const-string v1, "cover"
    
        invoke-virtual {v0, v1, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;
    
        const-string v1, "is_prev_enabled"
    
        invoke-virtual {v0, v1, v5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        const-string v1, "is_next_enabled"
    
        invoke-virtual {v0, v1, v5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        const-string v1, "is_ad_playing"
    
        invoke-virtual {v0, v1, v5}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        iget-object v1, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        invoke-virtual {v1, v0}, Landroid/app/Service;->sendBroadcast(Landroid/content/Intent;)V
    
        .line 32
        return-void
    .end method
    
    .method public final c()V
        .locals 7
    
        .prologue
        .line 39
        new-instance v1, Landroid/content/Intent;
    
        new-instance v4, Landroid/content/Intent;
    
        const-string v5, "com.android.music.metachanged"
    
        invoke-direct {v4, v5}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
    
        const-string v5, "id"
    
        const/4 v6, 0x1
    
        invoke-virtual {v4, v5, v6}, Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
    
        const-string v0, "android.appwidget.action.APPWIDGET_UPDATE"
    
        invoke-direct {v1, v0}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
    
        .line 40
        new-instance v0, Landroid/content/ComponentName;
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        const-class v3, Lcom/spotify/mobile/android/ui/widget/SpotifyWidget;
    
        invoke-direct {v0, v2, v3}, Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
    
        invoke-virtual {v1, v0}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
    
        .line 42
        const-string v0, "track_uri"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->c()Ljava/lang/String;
    
        move-result-object v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        .line 43
        const-string v0, "track_name"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->d()Ljava/lang/String;
    
        move-result-object v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        .line 44
        const-string v5, "track"
    
        invoke-virtual {v4, v5, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v0, "artist_name"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->f()Ljava/lang/String;
    
        move-result-object v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v5, "artist"
    
        invoke-virtual {v4, v5, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        .line 45
        const-string v0, "album_name"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->e()Ljava/lang/String;
    
        move-result-object v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
        
        const-string v5, "album"
    
        invoke-virtual {v4, v5, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        const-string v5, "playing"
    
        const-string v6, "JustPlaying"
    
        invoke-virtual {v4, v5, v6}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
    
        iget-object v5, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        invoke-virtual {v5, v4}, Landroid/content/Context;->sendBroadcast(Landroid/content/Intent;)V
    
    
        .line 46
    
        const-string v0, "paused"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->j()Z
    
        move-result v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        .line 48
        iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v0}, Lcom/spotify/mobile/android/util/bb;->g()Landroid/graphics/Bitmap;
    
        move-result-object v0
    
        .line 49
        if-eqz v0, :cond_0
    
        .line 50
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        invoke-virtual {v2}, Landroid/app/Service;->getResources()Landroid/content/res/Resources;
    
        move-result-object v2
    
        const v3, 0x7f09002c
    
        invoke-virtual {v2, v3}, Landroid/content/res/Resources;->getDimensionPixelSize(I)I
    
        move-result v2
    
        .line 52
        invoke-virtual {v0}, Landroid/graphics/Bitmap;->isRecycled()Z
    
        move-result v3
    
        if-eqz v3, :cond_1
    
        .line 53
        invoke-static {}, Lcom/spotify/mobile/android/ui/SpotifyImageLoader;->a()Lcom/spotify/mobile/android/ui/SpotifyImageLoader;
    
        invoke-static {}, Lcom/spotify/mobile/android/ui/SpotifyImageLoader;->b()V
    
        .line 54
        sget-object v0, Landroid/graphics/Bitmap$Config;->RGB_565:Landroid/graphics/Bitmap$Config;
    
        invoke-static {v2, v2, v0}, Landroid/graphics/Bitmap;->createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
    
        move-result-object v0
    
        .line 60
        :cond_0
        :goto_0
        const-string v2, "cover"
    
        invoke-virtual {v1, v2, v0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;
    
        .line 61
        const-string v0, "is_prev_enabled"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->k()Z
    
        move-result v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        .line 62
        const-string v0, "is_next_enabled"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->l()Z
    
        move-result v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        .line 63
        const-string v0, "is_ad_playing"
    
        iget-object v2, p0, Lcom/spotify/mobile/android/service/ag;->b:Lcom/spotify/mobile/android/util/bb;
    
        invoke-virtual {v2}, Lcom/spotify/mobile/android/util/bb;->m()Z
    
        move-result v2
    
        invoke-virtual {v1, v0, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
    
        .line 64
        iget-object v0, p0, Lcom/spotify/mobile/android/service/ag;->a:Landroid/app/Service;
    
        invoke-virtual {v0, v1}, Landroid/app/Service;->sendBroadcast(Landroid/content/Intent;)V
    
        .line 65
        return-void
    
        .line 56
        :cond_1
        const/4 v3, 0x1
    
        invoke-static {v0, v2, v2, v3}, Landroid/graphics/Bitmap;->createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;
    
        move-result-object v0
    
        goto :goto_0
    .end method
    _______________


    The modded recompiled apk is signed with the android testkey.

    This modded version is not tied to the Google Play Store, thus it will not auto-update when a new Spotify version is released, you either have to switch back to the regular newest version manually or check back here for an updated modded version upon release.


    Borrowed and Slightly Modified Original Source Code: https://github.com/loganakamatsu/SpotifyAVRCP


    Disclaimer: I'm sure Spotify doesn't like us messing around with their APK's. It is probably against their TOS, so consider this for educational purposes only and don't try to redistribute or sell it.


    If it works for you don't forget to click thanks! and feel free to make a donation if interested, link below.
    20
    Alternative method

    @mcuser:
    The original Spotify app is not working for me with Nexus 7 2013 (Stock), Galaxy S4 and a Pebble. No metadata at all :/

    I created a simple app which is using the notification of spotify when changing the title or play/pause. So it is just sending information about title and artist for now. Tested it with a Galaxy S4 (CM10.2) and Nexus 7 2013 with original Spotify app and a Pebble as bluetooth device - works well for me :) The apk file is attached in this post. If you want, you can try it.

    I hope it's ok to post an alternativ method/"solution" here.

    edit: Updated version available. Unfortunately I can't get the album name information. So theres a method to change the album placeholder ("cmcdev | metafy" is the standard one).

    Changelog v1.1:
    - set cusom album placeholder
    - add notificationlistener service for android 4.3 or higher, disable the accessibility service and use the new service if you have android 4.3. This should solve some talkback issues.
    - new app icon
    10
    Edit: Outdated version

    Edit: Outdated version
    9
    Spotify - May

    Here you guys go... I modded the new version of Spotify released a few days ago in the first week of May for Bluetooth Metadata. Also adds some nice new features and such.

    Change log:
    New: Now you can filter and sort your playlists and tracks.
    Fixed: When returning to your playlist view, you’ll always go back to the same position.
    Fixed: No more crashing when faced with special character$ in usernames.
    Fixed: When you next log in, Spotify will remember what you'd been listening to.

    Attached...