2012-01-14 163 views
4

我目前正在制作一个应用程序,以便与我的在线广播网站一起使用,我使用Android 2.2(API 8)对其进行编码,并且我有Shoutcast Stream使用两个按钮。在Android上接收ShoutCast流的信息

这里是我的主类代码:

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是在相对布局

谢谢,我是一个总noob,当谈到编程。

感谢纪念:)

回答

8

我刚刚得到的元数据我自己,我基本上都是从做了同样的东西: Pulling Track Info From an Audio Stream Using PHP。标题中有很多数据,因此您可以使用这些数据,但我只需要Stream标题,这就是我所得到的。

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

这看起来非常酷Tonithy,正是我所期待的。即时通讯新的Android编程,但有几个问题。 1)这段代码运行多久? 2)我试图把你的代码放在我的mainactivity类中,应用程序编译得很好,但是运行它时似乎不起作用,即它没有记录任何东西或做吐司,(我已经包含所有相关的导入),我需要添加清单文件中的意图过滤器让它在启动时运行此代码?还是应该自动运行?我如何从我的主要活动中调用它?对不起,我有点困惑 – user280109 2014-10-09 10:24:20

+1

@ user280109当我写这篇文章的时候,我对Android非常陌生,哈哈。如果你注意到,方法签名是'public void getNowPlaying(View v)',这会让我相信我将它绑定到xml中的一个按钮上,并在按钮上设置了'android:onClick =“getNowPlaying”'。这样每次你点击按钮它就会再次下载元数据。如果你不想使用按钮,你可以在你的'onCreate'方法(或任何地方......)中调用'getNowPlaying(null)',该方法对View参数没有任何作用... – Tonithy 2014-10-09 11:18:08

+0

感谢您的解释,我会给它一个尝试:) – user280109 2014-10-09 11:28:29