[MOD] Spotify app with AVRCP bluetooth metadata

Search This thread

alegend1979

Senior Member
Jan 28, 2014
148
14
The only problem I have with my Audi A6 (2013 model) ist that it doenst show song progress (i.e. time) when playing...
always shoing 0:00
Is there a way to fix this?
 

ajlennon

New member
Sep 5, 2007
1
0
No luck with Galaxy S3

Hi,

I tried the metadata app with my Samsung Galaxy S3 but no luck unfortunately.

Any thoughts on what I can do?

Thanks, Alex
 

craigsoup

Senior Member
Jun 13, 2009
71
20
bug?

Spotify Helper App: Problem with Huawei U9510 and latest version of spotify (version 1.1.1.162)

Meta-data only works for one song at a time.

When I jump to the next song the app show song as paused and isn't updating song-info to the navigation unit (Skoda RNS315).

Toggle "Persistant Service"-ON/OFF or pause and play song (in Spotify-app) makes the info show/update again.

Update: I've seen that it will work as it should if I let Spotify run without changing songs. -
When one song ends the next one start and songinfo comes... might just be the Spotify-app that is the problem!?
 
Last edited:

craigsoup

Senior Member
Jun 13, 2009
71
20
I tryed Metafy with no luck on my Galaxy s5.
Is there a patched version of new spotify app?

Haven't seen a patched version for a while :(

I've tried "AutoAudio - Spotify Helper" and it works pretty well (android 4.1.2). It dosn't require root, but need "Device Broadcast Status" to be enabled.

Ps. This app is no longer compatible with my device after the latest update. I was able to install version 1.2 (from play store) - it is now at version 1.6.
Pss. Version 1.2 (that was partially working with Spotify v 1.1.1.162) isn't working with latest version 1.1.2.449.

- I'm really thinking of replacing Spotify with Google's own music store/player - that app works flawlessly with my phone and RNS315.
Spotify have not been able to fix this for ever so long :(
 
Last edited:

mantici

Member
Oct 10, 2006
19
7
Haven't seen a patched version for a while :(

I've tried "AutoAudio - Spotify Helper" and it works pretty well (android 4.1.2). It dosn't require root, but need "Device Broadcast Status" to be enabled.

Ps. This app is no longer compatible with my device after the latest update. I was able to install version 1.2 (from play store) - it is now at version 1.6.
Pss. Version 1.2 (that was partially working with Spotify v 1.1.1.162) isn't working with latest version 1.1.2.449.

- I'm really thinking of replacing Spotify with Google's own music store/player - that app works flawlessly with my phone and RNS315.
Spotify have not been able to fix this for ever so long :(


sorry about that guys, but spotify seems to have killed the device broadcast feature in their latest version, it's just not pushing broadcasts anymore (but they left the setting for it in the settings panel -- way to go Spotify!), so I had to rewrite autoAudio to use notification access instead of the spotify device broadcast, so that's for 4.3 and up (sorry again). But this gives me a few advantages

1) can read all notifications (after you give it access) and can push new notifications to your stereo (for 15 seconds).
2) works with other music apps too (amazon & pandora)

disadvantage:
some apps (like spotify) only put notifications up when the app is not in the foreground, so autoAudio can't do it's job unless the app is in the background (or the screen is off)

OH, I've added some code specifically for Samsung devices. but i can't test it because i don't have a Sammy device. Let me know if it works on Samsung (i've gotten one report that it works on GS5)


https://play.google.com/store/apps/details?id=com.anticsoft.autoaudio

donate:
https://play.google.com/store/apps/details?id=com.anticsoft.donate
 
Last edited:
  • Like
Reactions: craigsoup

Grooby97

Senior Member
Oct 12, 2009
298
24
Using the latest MIUI and it's saying the device is not supported.. :(

Sent from my HTC One using Tapatalk 2
 

tiltratt

Member
Apr 5, 2008
7
0
Thats because the DEH-4500BT does only support AVRCP 1.1 which enables you only to use the controls. I have the same headunit.
FYI
in hindsight that's not entirely accurate...
After upgrading from the HTC OneX to Samsung S5 the stereo now shows the songtitles, artist and album in the display :D
HTX Mini2 also works...
 

IronWolve

Senior Member
May 8, 2008
180
13
Seattle
LG V30
Samsung Note 4, broken by design.

Fixify wont work for the samsung note, from what I can search. The Note 4 has AVCRP 1.5 which many car radios dont support. Older Samsungs have 1.3 which seems to work just fine. Crazy, my S3 worked fine, my note 4, no metadata at all on same new car radio.
 

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...