Android 从Shoutcast流获取元数据
我正在为Android设备开发一个无线电应用程序,该应用程序应该可以从Shoutcast服务器获取流媒体 声音工作正常,但我也想检索元数据,以便能够显示当前播放的歌曲的标题、艺术家以及专辑图片 我使用了MediaMetaDataRetriever,但它似乎根本不起作用 这是我使用的代码:Android 从Shoutcast流获取元数据,android,media-player,metadata,audio-streaming,shoutcast,Android,Media Player,Metadata,Audio Streaming,Shoutcast,我正在为Android设备开发一个无线电应用程序,该应用程序应该可以从Shoutcast服务器获取流媒体 声音工作正常,但我也想检索元数据,以便能够显示当前播放的歌曲的标题、艺术家以及专辑图片 我使用了MediaMetaDataRetriever,但它似乎根本不起作用 这是我使用的代码: public class MainActivity extends FragmentActivity { private ImageView bannerView; private int[] pub = {
public class MainActivity extends FragmentActivity {
private ImageView bannerView;
private int[] pub = {R.drawable.banner, R.drawable.pubnautic, R.drawable.pubquad};
private int i = 0;
private ImageView play;
private ImageView pause;
private TextView title;
private MediaPlayer mediaPlayer;
private MediaMetadataRetriever retriever;
private String out;
private String url = "http://streamplus8.leonex.de:14910";
//adele-someonelikeyou
//Accordossie
//http://support.k-designed.net/test-z/music/adele-someonelikeyou.mp3
private ImageView albumpic;
private byte[] image;
private boolean paused = false;
private ImageView exit;
private ImageView wish;
private ImageView reservation;
private ImageView contact;
private ImageView facebook;
private ImageView twitter;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bannerView = (ImageView) findViewById(R.id.banner);
play = (ImageView) findViewById(R.id.play);
pause = (ImageView) findViewById(R.id.pause);
exit = (ImageView) findViewById(R.id.exit);
albumpic = (ImageView) findViewById(R.id.artist);
title = (TextView) findViewById(R.id.title);
retriever = new MediaMetadataRetriever();
mediaPlayer = new MediaPlayer();
wish = (ImageView) findViewById(R.id.wish);
reservation = (ImageView) findViewById(R.id.shop);
contact = (ImageView) findViewById(R.id.contact);
facebook = (ImageView) findViewById(R.id.facebook);
twitter = (ImageView) findViewById(R.id.twitter);
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
retriever.setDataSource(url);
mediaPlayer.prepareAsync();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Please check your connection!", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
if(paused == true) {
mediaPlayer.start();
} else {
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
}
paused = false;
image = retriever.getEmbeddedPicture();
if(image != null) {
albumpic.setImageBitmap(BitmapFactory.decodeByteArray(image, 0, image.length));
}
out = "Title: " + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) + " \nArtist: " + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
title.setText(out);
play.setVisibility(ImageView.GONE);
pause.setVisibility(ImageView.VISIBLE);
} catch(Exception e) {
e.printStackTrace();
}
}
});
pause.setClickable(true);
pause.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pause.setVisibility(ImageView.GONE);
play.setVisibility(ImageView.VISIBLE);
mediaPlayer.pause();
paused = true;
}
});
wish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent wishIntent = new Intent(MainActivity.this, Wish.class);
startActivity(wishIntent);
}
});
reservation.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent reservIntent = new Intent(MainActivity.this, Reservation.class);
startActivity(reservIntent);
}
});
contact.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent contactIntent = new Intent(MainActivity.this, Contact.class);
startActivity(contactIntent);
}
});
facebook.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent facebookIntent = new Intent(MainActivity.this, FacebookActivity.class);
facebookIntent.putExtra("name", "Just now listening to: " + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) + " by " + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
facebookIntent.putExtra("caption", "On AgadirAdventure Radio");
facebookIntent.putExtra("description", "A Radio App for Android Devices by K-Designed");
facebookIntent.putExtra("link", "http://www.agadiradventure.com/");
facebookIntent.putExtra("picture", "http://agadiradventure.com/images/logo/logo1.png");
startActivity(facebookIntent);
}
});
twitter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
initShareIntent("twi");
}
});
exit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
onBackPressed();
}
});
bannerView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse("http://www.agadiradventure.com");
Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uri);
startActivity(launchBrowser);
}
});
Runnable r = new Runnable() {
@Override
public void run() {
bannerView.setImageResource(pub[i]);
i++;
if(i >= pub.length) {
i = 0;
}
bannerView.postDelayed(this, 3000);
}
};
bannerView.postDelayed(r, 3000);
}
private void initShareIntent(String type) {
boolean found = false;
Intent share = new Intent(android.content.Intent.ACTION_SEND);
share.setType("text/plain");
// gets the list of intents that can be loaded.
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
if (!resInfo.isEmpty()){
for (ResolveInfo info : resInfo) {
if (info.activityInfo.packageName.toLowerCase().contains(type) ||
info.activityInfo.name.toLowerCase().contains(type) ) {
String sharedText = "Just now listening to: " + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) + " by " + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) + "\nOn AgadirAdventure\nwww.agadiradventure.com";
share.putExtra(Intent.EXTRA_TEXT, sharedText);
share.setPackage(info.activityInfo.packageName);
found = true;
break;
}
}
if (!found)
return;
startActivity(Intent.createChooser(share, "Select"));
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
public类MainActivity扩展了FragmentActivity{
私人ImageView bannerView;
private int[]pub={R.drawable.banner,R.drawable.pubnautic,R.drawable.pubquad};
私有整数i=0;
私家影剧;
私有图像查看暂停;
私有文本视图标题;
私人媒体播放器;
私有媒体元数据检索器;
私下串通;
专用字符串url=”http://streamplus8.leonex.de:14910";
//像你这样的人
//手风琴
//http://support.k-designed.net/test-z/music/adele-someonelikeyou.mp3
私有图像视图;
私有字节[]图像;
private=false;
私用影像出口;
私人影像查看愿望;
私家影院预订;
私人影像查看联系人;
私有ImageView facebook;
私有ImageView推特;
@凌驾
创建时受保护的void(最终捆绑包savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bannerView=(ImageView)findViewById(R.id.banner);
play=(ImageView)findViewById(R.id.play);
pause=(ImageView)findViewById(R.id.pause);
exit=(ImageView)findViewById(R.id.exit);
albumpic=(ImageView)findViewById(R.id.artist);
title=(TextView)findViewById(R.id.title);
retriever=新的MediaMetadataRetriever();
mediaPlayer=新的mediaPlayer();
wish=(ImageView)findviewbyd(R.id.wish);
预订=(ImageView)findViewById(R.id.shop);
联系人=(ImageView)findViewById(R.id.contact);
facebook=(ImageView)findviewbyd(R.id.facebook);
twitter=(ImageView)findviewbyd(R.id.twitter);
这个.setVolumeControlStream(AudioManager.STREAM_MUSIC);
试一试{
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
setDataSource(url);
mediaPlayer.prepareAsync();
}捕获(例外e){
Toast.makeText(getApplicationContext(),“请检查您的连接!”,Toast.LENGTH\u LONG.show();
e、 printStackTrace();
}
play.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
试一试{
如果(暂停==真){
mediaPlayer.start();
}否则{
mediaPlayer.setOnPreparedListener(新的OnPreparedListener(){
@凌驾
已准备好公开作废(MediaPlayer mp){
mediaPlayer.start();
}
});
}
暂停=错误;
image=retriever.getEmbeddedPicture();
如果(图像!=null){
albumpic.setImageBitmap(BitmapFactory.decodeByteArray(image,0,image.length));
}
out=“Title:”+retriever.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u Title)+“\n作者:”+retriever.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u);
title.setText(out);
play.setVisibility(ImageView.GONE);
pause.setVisibility(ImageView.VISIBLE);
}捕获(例外e){
e、 printStackTrace();
}
}
});
暂停。可点击设置(真);
pause.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
暂停。设置可见性(ImageView.GONE);
play.setVisibility(ImageView.VISIBLE);
mediaPlayer.pause();
暂停=真;
}
});
wish.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent-wishIntent=新意图(MainActivity.this、Wish.class);
星触觉(wishIntent);
}
});
reservation.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
意向保留内容=新意向(MainActivity.this,Reservation.class);
起始触觉(保留内容);
}
});
contact.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
意向contactIntent=新意向(MainActivity.this,Contact.class);
起始触觉(接触意图);
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent facebookIntent=新的Intent(MainActivity.this,FacebookActivity.class);
facebookIntent.putExtra(“名称”,“刚才正在侦听:”+retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)+“由”+retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
facebookIntent.putExtra(“标题”,“在AgadirAdventureRadio上”);
facebookIntent.putExtra(“描述”,“K-design为Android设备设计的无线电应用程序”);
facebookIntent.putExtra(“链接”http://www.agadiradventure.com/");
facebookIntent.putExtra(“图片”http://agadiradventure.com/images/logo/logo1.png");
startActivity(facebookIntent);
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
初始共享意图(“twi”);
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
mediaPlayer.stop();
onBackPressed();
}
});
bannerView.setOnClickListener(新的OnClickListener(){
@越过
ShoutCastMetadataRetriever smr = new ShoutCastMetadataRetriever();
smr.setDataSource(<some url>);
String artist = smr.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_ARTIST);
String title = smr.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_TITLE);
String title = "";
IcyStreamMeta meta = new IcyStreamMeta();
try {
meta.setStreamUrl(new URL(YOURURL));
title = meta.getStreamTitle();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}