2012-01-14 3 views
4

В настоящее время я делаю приложение, чтобы перейти с моего онлайн-радио-сайта, я кодирую его с Android 2.2 (API 8), и у меня есть Shoutcast Stream, работающий с двумя кнопками.Получение информации о потоке ShoutCast на Android

Вот код на мой основной класс:

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, когда дело доходит до программирования.

Благодаря маркировать :)

ответ

0

Что вы используете для воспроизведения потока не имеет никакого знания (и не заботится о) метаданных. Вам придется иметь дело с этим отдельно.

Посмотреть эти сообщения для чего-то вы можете легко адаптироваться к Android:

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

Это выглядит действительно круто. Тонити, именно то, что я ищу. Я новичок в программировании для Android и имею пару вопросов. 1) как часто будет выполняться этот код? 2) Я попытался поместить ваш код в мой класс mainactivity, приложение компилируется отлично, но при запуске оно не работает, т. Е. Не регистрирует ничего или делает тосты (я включил все соответствующие импорты), мне нужно добавить фильтр намерения в файле манифеста, чтобы заставить его запускать этот код при запуске? или он должен запускаться автоматически? как я называю это из своей основной деятельности? извините, я немного смущен – user280109

+1

@ user280109 Я был довольно новичком для Android, когда я написал это также, lol. Если вы заметите, подпись метода будет 'public void getNowPlaying (View v)', которая заставит меня поверить, что я привязал ее к кнопке в xml с 'android: onClick =" getNowPlaying ", установленным на кнопке. Таким образом, каждый раз, когда вы нажимаете кнопку, он снова загружает метаданные. Если вы не хотите использовать кнопку, вы можете просто вызвать 'getNowPlaying (null)' в свой метод 'onCreate' (или где угодно ...), этот метод ничего не делает с параметром View ... – Tonithy

+0

спасибо за объяснение, я дам ему попробовать :) – user280109

Смежные вопросы