2012-05-09 49 views
31

我正在实施与获取当前音乐曲目信息相关的应用程序。当前播放音乐的曲目信息

我使用下面的代码来获取:

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(); 
     } 
    }; 

} 

那也只是一些手机工作正常。我想实现代码以获取所有Android设备(例如HTC和三星设备)中的当前音乐曲目信息。

有没有办法做到这一点?

+1

我有一个问题,这个对ICS。我正在为ICS制作媒体播放器小部件。只要我推出我的第一个小部件,并且是本地播放器播放的一些音乐,我就会在正确的歌曲细节中获得metachange意图,并在几毫秒内获得playstate改变的意图,并带有一些其他歌曲名称。任何想法如何解决这个问题? – AndroidGuy

+0

提供样本获取carrect正在播放歌曲的详细信息 – kiran

+0

对不起,但我没有得到你基兰,我使用上面提到的相同的代码。我的onReceive被调用两次,一次用于com.android.music.metachanged&立即用于com.android.music.playstatechanged,但是我从这两种意图得到的轨道是不同的。 MetaChanged提供了正确的名称,但“播放状态”更改提供了不同的名称。这只发生在初次发射。我如何绕过Playstate更改的第一次启动。 – AndroidGuy

回答

6

这可能有帮助。我使用的音频文件这让元数据在我的应用程序之一:

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

有很多中,你可以用它来找到你要找什么,因为我觉得MediaStore.Audio.Media类列。

+0

上述代码是否从第三方音乐播放器或仅Android默认音乐播放器捕获音乐细节? – tamil

+0

它从一个标准的媒体文件捕获音乐细节,我认为它基于ID3标签而不是任何程序播放该文件。 – JMRboosties

+0

想用这个协助我吗? – Broak

46

检查这这是我在我的应用程序的工作以及使用

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

它的工作:)谢谢。另外,当我使用我的“Samsung Galaxy Note5”进行测试时,会调用“com.android.music.metachanged”。 – iroiroys

3

亚马逊MP3(建设2.8.1)似乎有前缀与com.amazon.mp3的额外所以com.amazon.mp3 .metachanged我用:

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

    } 

这是方便检查额外的名字:

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

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

对此表示感谢,至今仍准确:) –

2
import com.example.media.R; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.widget.Toast; 

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.activity_main); 

     IntentFilter iF = new IntentFilter(); 

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

     registerReceiver(mReceiver, iF); 
    } 

    private BroadcastReceiver mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String track = intent.getStringExtra("track");   
      Toast.makeText(CurrentMusicTrackInfoActivity.this, track, Toast.LENGTH_SHORT).show(); 
     } 
    }; 

} 

有我我的Xperia索拉设备上运行,但停止任何错误,请帮我

+0

如果我可能提出建议,对代码所做的某些说明可能有助于提问者。 –

相关问题