2012-06-10 117 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

相關問題