2012-06-10 175 views
1

我正在为一个在线电台建立一个简单的应用程序。我使用此代码来使用MediaPlayer来流式传输站。它在一个问题上效果很好。我不知道如何向听众展示他们实际上在听什么。 我的代码:您如何从MediaPlayer获取艺术家和歌曲标题?

package com.xxxx.android; 

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.List; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.database.Cursor; 
import android.app.Activity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnBufferingUpdateListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.provider.MediaStore.Audio; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

@SuppressWarnings("unused") 
public class MainActivity extends Activity implements OnClickListener { 

private final static String RADIO_STATION_URL = "http://"; 
private Button buttonPlay; 
private Button buttonStopPlay; 
private MediaPlayer player; 
private TextView showdisplay; 
private String strInfo; 

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

initializeUIElements(); 

initializeMediaPlayer();  
}  

private void initializeUIElements() { 
buttonPlay = (Button) findViewById(R.id.buttonPlay); 
buttonPlay.setOnClickListener(this); 

buttonStopPlay = (Button) findViewById(R.id.buttonStopPlay); 
buttonStopPlay.setEnabled(false); 
buttonStopPlay.setOnClickListener(this); 
showdisplay = (TextView) findViewById(R.id.lblDisplay); 
} 

public void onClick(View v) { 
if (v == buttonPlay) { 
    startPlaying(); 
} else if (v == buttonStopPlay) { 
    stopPlaying(); 
} 
} 

private void startPlaying() { 
buttonStopPlay.setEnabled(true); 
buttonPlay.setEnabled(false); 
showdisplay.setText("Buffering..");   

player.prepareAsync(); 

player.setOnPreparedListener(new OnPreparedListener() { 

    public void onPrepared(MediaPlayer mp) { 
     player.start(); 
    } 
}); 
} 

private void stopPlaying() { 
if (player.isPlaying()) { 
    player.stop(); 
    player.release(); 
    initializeMediaPlayer(); 
} 

buttonPlay.setEnabled(true); 
buttonStopPlay.setEnabled(false); 
} 

private void initializeMediaPlayer() { 
player = new MediaPlayer(); 
try { 
    player.setDataSource(RADIO_STATION_URL); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (IllegalStateException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { 

    public void onBufferingUpdate(MediaPlayer mp, int percent) { 
     Log.i("Buffering", "" + percent); 
    } 
});  
} 

@Override 
protected void onPause() { 
super.onPause(); 
if (player.isPlaying()) { 
    player.stop(); 
} 
} 

如何... specifically..and非常详细......我更新的TextView“showdisplay”与艺术家和歌曲名称从MediaPlayer的无线流下来?

感谢

回答

5

快速调查告诉我,android.media.MediaPlayer只关心数据流而不是其他。因此,如果您还想检索流的元数据(电台名称,艺术家,歌曲等),则必须使用不同的对象单独执行。

android.media.MediaMetadataRetreiver类似乎是建立这样做。看起来您应该研究MetadataRetreiver.extractMetadata()函数以及METADATA_KEY_ARTISTMETADATA_KEY_TITLE键。

这是the MediaMetadataRetreiver API。另外,请看this previous StackOverflow question

我不是Android开发人员,所以我不能机制保障我的代码是正确的,但我认为它看起来是这样的:

MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
metaRetreiver.setDataSource(RADIO_STATION_URL) 
String artist = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST; 
String title = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 

(全面披露:从here修改后的代码)

+0

没有人知道如何去做这个?让MediaPlayer实际流式播放shoutcast服务器是件小事,但却不知道从该流中显示艺术家/歌曲的方法? – user1446579

+5

@ user1446579我编辑了我的回复以包含代码片段。不过,我觉得你甚至没有检查我评论之前包含的链接。您没有告诉我您为解决问题所做的工作以及为什么我的解决方案无法正常工作。我觉得你想要为你编写代码,这并不酷。 – acattle

相关问题