Get Current Song Information with Xamarin.Android
Hey with this thread, we can learn to get a music players song information and download a thumbnail from iTunes Apple =).
First add a Xamarin.Android project
Now in the Project add the follow components
- Json.Net
- Android Support Library v4
After this add a Main.axml layout with only one button.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/myButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Service" />
</LinearLayout>
Now this is the MainActivity.cs Code its very easy we add two clases one as a BroadcastReceiver and the other one as a Service
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Support.V4.App;
using Android.Media;
using System.Text;
using System.Net;
using System.IO;
using Android.Graphics;
using Android.Content.Res;
namespace MusicPlayerInfo
{
[Activity (Label = "MusicPlayerInfo", MainLauncher = true)]
public class MainActivity : Activity
{
//NotificationCompat builder
static NotificationCompat.Builder builder;
//Notification Manager
static NotificationManager notificationManager;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
Button button = FindViewById<Button> (Resource.Id.myButton);
//button click Event
button.Click += delegate {
//star a new Mservice to cach music info
StartService(new Intent(this, typeof(Mservice)));
//Show tast message
Toast.MakeText(this,"Music Service Started¡¡¡¡",ToastLength.Short).Show();
};
//Inicialize Notification builder
builder = new NotificationCompat.Builder (this)
.SetContentTitle (this.Title)
.SetSmallIcon(Resource.Drawable.ic_launcher)
.SetContentText (this.Title);
//Set persistent notification
builder.SetOngoing (true);
//Get notification manager service
notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
}
//mCustomR this class reicibe the action activity from music players.
public class mCustomR:BroadcastReceiver
{
/// <param name="context"<The Context in which the receiver is running.</param>
/// <param name="intent">The Intent being received.</param>
/// <summary>
/// This method is called when the BroadcastReceiver is receiving an Intent
/// broadcast.
/// </summary>
public override void OnReceive (Context context, Intent intent)
{
//get action from intent
string action = intent.Action;
//get command from action
string cmd = intent.GetStringExtra("command");
//write info
Console.WriteLine("mIntentReceiver.onReceive " + action + " / " + cmd);
//get artist from intent
String artist = intent.GetStringExtra("artist");
//get album from intent
String album = intent.GetStringExtra("album");
//get track from intent
String track = intent.GetStringExtra("track");
//write all info
Console.WriteLine(artist+":"+album+":"+track);
//set content title to notification builder
builder.SetContentTitle (artist);
//set contennt text to notification builder
builder.SetContentText (track+"-"+album);
//set big style to builder
builder.SetStyle (new NotificationCompat.BigTextStyle ().BigText (track + "-" + album));
try
{
//search album thumbnail from itunes api
var json = new System.Net.WebClient().DownloadString("http://itunes.apple.com/search?term=" + Uri.EscapeDataString(track+" "+album+" "+artist) + "&country=mx&limit=1&entity=song");
//parse json downloaded to json object
Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.Parse(json);
//get json "results" child
var n = o["results"];
//get firts "artworkUrl100" property
string val = (string)n[0]["artworkUrl100"];
//check if exist thumbnail
if (string.IsNullOrEmpty(val))
{
//if thumbnail doesnt exists set default image to largeicon
builder.SetLargeIcon(BitmapFactory.DecodeResource(null,Resource.Drawable.ic_launcher));
}
else
{
//change 100x100 size of thumbnail to 600x600 image
StringBuilder builde = new StringBuilder(val);
builde.Replace("100x100", "600x600");
//webclient to download image
WebClient c = new WebClient();
//downloadimage to bytearray
byte[] data = c.DownloadData(builde.ToString());
//convert byte[] downloaded to bitmap and set large icon to builder
builder.SetLargeIcon(Bitmap.CreateScaledBitmap(BitmapFactory.DecodeByteArray(data,0,data.Length),150,150,false));
}
}
catch(Exception e)
{
//set default image to largeicon
builder.SetLargeIcon(BitmapFactory.DecodeResource(null,Resource.Drawable.ic_launcher));
}
//update/create a notification
notificationManager.Notify(0, builder.Build());
}
}
//class type service to work in background
[Service]
public class Mservice: Service
{
//Receiver class
private mCustomR mReceiver = new mCustomR ();
/// <summary>
/// Raises the bind event.
/// </summary>
/// <param name="intent">Intent.</param>
public override IBinder OnBind (Intent intent)
{
return null;
}
/// <summary>
/// Called by the system when the service is first created.
/// </summary>
public override void OnCreate ()
{
base.OnCreate ();
//IntentnFilter all actities to receive information
IntentFilter iF = new IntentFilter();
iF.AddAction("com.android.music.metachanged");
iF.AddAction("com.android.music.playstatechanged");
iF.AddAction("com.android.music.playbackcomplete");
iF.AddAction("com.android.music.queuechanged");
iF.AddAction("com.htc.music.metachanged");
iF.AddAction("fm.last.android.metachanged");
iF.AddAction("com.sec.android.app.music.metachanged");
iF.AddAction("com.nullsoft.winamp.metachanged");
iF.AddAction("com.amazon.mp3.metachanged");
iF.AddAction("com.miui.player.metachanged");
iF.AddAction("com.real.IMP.metachanged");
iF.AddAction("com.sonyericsson.music.metachanged");
iF.AddAction("com.rdio.android.metachanged");
iF.AddAction("com.samsung.sec.android.MusicPlayer.metachanged");
iF.AddAction("com.andrew.apollo.metachanged");
//register receiver with intentnfilter
RegisterReceiver(mReceiver, iF);
}
public override void OnDestroy ()
{
base.OnDestroy ();
}
}
}
}
Now check the results.
Full Code GitHub: https://github.com/AlejandroRuiz/Mono/tree/master/MusicPlayerInfo
Awesome you can add this simple function to your apps, now just take a time to drink a beer.








Thanks Alejandro, do you know if works with spotify playing song?
ResponderEliminarHello. I tried this code, but it does not generate receive any intents. I tried with a few music players. Any updated code? Thanks.
ResponderEliminarHi Author just now i found your blog its really awesome. Keep this work. It will more helpful for xamarin app developers.
ResponderEliminarHire affordable Xamarin Developer