33 votes

Informations sur la piste de la musique en cours de lecture

Je suis en train de mettre en place une application permettant d'obtenir des informations sur les morceaux de musique en cours.

J'utilise le code suivant pour obtenir ce résultat :

public class CurrentMusicTrackInfoActivity extends Activity {

    public static final String SERVICECMD = "com.android.music.musicservicecommand";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        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");

        registerReceiver(mReceiver, iF);
    }

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            String cmd = intent.getStringExtra("command");
            Log.v("tag ", action + " / " + cmd);
            String artist = intent.getStringExtra("artist");
            String album = intent.getStringExtra("album");
            String track = intent.getStringExtra("track");
            Log.v("tag", artist + ":" + album + ":" + track);
            Toast.makeText(CurrentMusicTrackInfoActivity.this, track, Toast.LENGTH_SHORT).show();
        }
    };

}

Cela fonctionne bien pour certains mobiles seulement. Je souhaite implémenter un code permettant d'obtenir des informations sur la piste musicale actuelle sur tous les appareils Android (par exemple, les appareils HTC et Samsung).

Y a-t-il un moyen de le faire ?

1 votes

J'ai un problème avec cela sur ICS. Je suis en train de créer un widget de lecteur multimédia pour ICS. Dès que je lance mon premier widget et qu'il y a de la musique en cours de lecture dans le lecteur natif, je reçois une intention métachangée avec les détails corrects de la chanson et quelques millisecondes plus tard, je reçois une intention de changement d'état de lecture, avec un autre nom de chanson. Une idée pour résoudre ce problème ?

0 votes

Fournir un échantillon pour obtenir les détails de la chanson jouée correctement

0 votes

Désolé, mais je n'ai pas compris Kiran, j'utilise le même code que vous avez mentionné ci-dessus. Mon onReceive est appelé deux fois, une fois pour com.Android.music.metachanged et immédiatement pour com.Android.music.playstatechanged, mais la piste que je reçois des deux intents est différente. MetaChanged donne le nom correct, mais Playstate change donne un nom différent. Cela ne se produit que lors du lancement initial. Comment puis-je contourner le Playstate change pour le premier lancement ?

47voto

hderanga Points 548

Vérifiez ceci, c'est ce que j'utilise dans mon application et cela fonctionne bien.

    iF.addAction("com.android.music.metachanged");

    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");

0 votes

Ça marche :) merci. De plus, lorsque j'ai testé avec mon "Samsung Galaxy Note5", "com.Android.music.metachanged" est appelé.

7voto

JMRboosties Points 3077

Ceci pourrait vous aider. Je l'utilise pour obtenir des métadonnées sur des fichiers audio dans une de mes applications :

String scheme = mAudioUri.getScheme();
String title = "";
String artist = "";
if(scheme.equals("content")) {
    String[] proj = {MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST};
    Cursor cursor = this.getContentResolver().query(mAudioUri, proj, null, null, null);
    if(cursor != null && cursor.getCount() > 0) {
        cursor.moveToFirst();
        if(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE) != -1) {  
            title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
            artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
        }
    }
}

Il y a beaucoup de colonnes dans la classe MediaStore.Audio.Media que vous pouvez utiliser pour trouver ce que vous cherchez, je pense.

0 votes

Le code ci-dessus capture-t-il les détails de la musique à partir de lecteurs de musique tiers ou seulement du lecteur de musique par défaut d'Android ?

0 votes

Il capture les détails musicaux d'un fichier multimédia standard, je pense qu'il se base sur les balises ID3 plutôt que sur le programme qui lit le fichier.

0 votes

Vous voulez bien m'aider ?

4voto

chughes Points 36

Amazon MP3 (Build 2.8.1) semble préfixer les extras avec com.amazon.mp3 donc pour com.amazon.mp3.metachanged j'ai utilisé :

    String artist = "";
    String track = "";
    if (action.equals("com.amazon.mp3.metachanged")) {
        artist = intent.getStringExtra("com.amazon.mp3.artist");
        track = intent.getStringExtra("com.amazon.mp3.track");
    } else {
        artist = intent.getStringExtra("artist");
        track = intent.getStringExtra("track");

    }

C'était pratique pour vérifier les noms supplémentaires :

    Set<String> extrasList = intent.getExtras().keySet();

    for (String str : extrasList) {
        Log.d(TAG, str);
    }

1 votes

Je suis venu vous dire merci pour cet article, toujours d'actualité :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X