在Android上接收ShoutCast流的信息
我目前正在制作一个应用程序来配合我的在线广播网站,我正在用Android 2.2(API 8)进行编码,我已经用两个按钮实现了Shoutcast流 下面是我的主类的代码:在Android上接收ShoutCast流的信息,android,metadata,shoutcast,Android,Metadata,Shoutcast,我目前正在制作一个应用程序来配合我的在线广播网站,我正在用Android 2.2(API 8)进行编码,我已经用两个按钮实现了Shoutcast流 下面是我的主类的代码: public class GrooveOfMusicRadioActivity extends Activity { /** Called when the activity is first created. */ MediaPlayer mediaPlayer; Button star
public class GrooveOfMusicRadioActivity extends Activity {
/** Called when the activity is first created. */
MediaPlayer mediaPlayer;
Button start, stop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) findViewById(R.id.button1);
stop = (Button) findViewById(R.id.button2);
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mediaPlayer.start();
}
});
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mediaPlayer.pause();
}
});
String url = "http://67.212.165.106:8161"; // your URL here
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
try {
mediaPlayer.setDataSource(url);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
所以我想知道我怎么才能收到流标题,歌曲,艺术家等等。。让它出现
主XML处于相对布局中
谢谢,说到编程,我是个十足的傻瓜
谢谢mark:)您用来播放流的内容不知道(也不关心)元数据。你必须单独处理这个问题 请参阅以下文章,了解您可以轻松适应Android的内容:
Activity mainAct = this;
public void getNowPlaying(View v) {
Log.w("getNowPlaying", "fired");
new Thread(new Runnable() {
public void run() {
String title = null, djName = null;
try {
URL updateURL = new URL(YOUR_STREAM_URL_HERE);
URLConnection conn = updateURL.openConnection();
conn.setRequestProperty("Icy-MetaData", "1");
int interval = Integer.valueOf(conn.getHeaderField("icy-metaint")); // You can get more headers if you wish. There is other useful data.
InputStream is = conn.getInputStream();
int skipped = 0;
while (skipped < interval) {
skipped += is.skip(interval - skipped);
}
int metadataLength = is.read() * 16;
int bytesRead = 0;
int offset = 0;
byte[] bytes = new byte[metadataLength];
while (bytesRead < metadataLength && bytesRead != -1) {
bytesRead = is.read(bytes, offset, metadataLength);
offset = bytesRead;
}
String metaData = new String(bytes).trim();
title = metaData.substring(metaData.indexOf("StreamTitle='") + 13, metaData.indexOf(" / ", metaData.indexOf("StreamTitle='"))).trim();
djName = metaData.substring(metaData.indexOf(" / ", metaData.indexOf("StreamTitle='")) + 3, metaData.indexOf("';", metaData.indexOf("StreamTitle='"))).trim();
Log.w("metadata", metaData);
is.close();
} catch (MalformedURLException e) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace(); }
final String titleFin = title;
final String djNameFin = djName;
mainAct.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(mainAct, titleFin + "\n" + djNameFin, Toast.LENGTH_SHORT).show();
}
});
}
}).start();
}
Activity mainAct=this;
公共无效getNowPlaying(视图五){
Log.w(“getNowPlaying”、“fired”);
新线程(newrunnable()){
public void run(){
字符串title=null,djName=null;
试一试{
URL updateURL=新URL(您的\u流\u URL\u在此);
URLConnection conn=updateURL.openConnection();
conn.setRequestProperty(“Icy元数据”,“1”);
int interval=Integer.valueOf(conn.getHeaderField(“icy metaint”);//如果您愿意,可以获得更多的头。还有其他有用的数据。
InputStream is=conn.getInputStream();
int=0;
while(跳过<间隔){
跳过+=是.skip(间隔-跳过);
}
int metadataLength=is.read()*16;
int字节读取=0;
整数偏移=0;
字节[]字节=新字节[metadataLength];
while(bytesRead
今天看起来真的很酷,这正是我要找的。不过,我对android编程还不熟悉,有几个问题。1) 这段代码多久运行一次?2) 我试着把你的代码放在我的mainactivity类中,这个应用程序编译得很好,但是当运行它的时候似乎不起作用,也就是说它没有记录任何东西或者做祝酒(我已经包括了所有相关的导入),我需要在清单文件中添加一个意图过滤器来让它在启动时运行这个代码吗?还是应该自动运行?从我的主要活动中我该如何称呼它?对不起,我有点confused@user280109当我写这篇文章的时候,我对Android也是相当陌生的,哈哈。如果你注意到,方法签名是public void getNowPlaying(View v)
,这会让我相信我将它绑定到了一个xml按钮上,并且在按钮上设置了Android:onClick=“getNowPlaying”
。这样,每次单击按钮时,它都会再次下载元数据。如果您不想使用按钮,可以在onCreate
方法(或任何地方…)中调用getNowPlaying(null)
,该方法无论如何都不会对View参数执行任何操作…我将其设置为在单击按钮时运行getNowPlaying函数,如您所建议的。但代码似乎在以下行失败:int interval=Integer.valueOf(conn.getHeaderField(“ice metaint”);错误是“E/AndroidRuntime(2993):java.lang.NumberFormatException:Invalid int:“null”,我尝试了各种shoutcast流,但它们都给出了相同的错误。啊,没关系,我在这里找到了一个更简单的解决方案:尽管我也无法让该解决方案工作,令人沮丧。