Internet rádió meta adatok kiolvasása
Internetrádióban játszott szám címének és előadójának kiolvasása
MainActivity.java
public Runnable m = new Runnable() { @Override public void run() { try { IcyStreamMeta icy = new IcyStreamMeta(new URL("http://gr-relay-16.gaduradio.pl/33")); final String data = icy.getArtist()+"-"+icy.getTitle(); final TextView meta = (TextView) findViewById(R.id.textView); runOnUiThread(new Runnable() { public void run() { try { meta.setText(data); } catch (StringIndexOutOfBoundsException e) { e.printStackTrace(); } } }); } catch (MalformedURLException e) { } catch (IOException e) { } } }; public void gomb(View view) { Thread rere = new Thread(m); rere.start(); }
A gomb itt alul egy Button onClick eseménye.
Utána File -> New -> Java Class IcyStreamMeta névvel hozzunk létre egy java fájlot.
IcyStreamMeta.java
package com.project.domel.kiserletezo1; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class IcyStreamMeta { protected URL streamUrl; private Map<String, String> metadata; private boolean isError; public IcyStreamMeta(URL streamUrl) { setStreamUrl(streamUrl); isError = false; } public String getArtist() throws IOException { Map<String, String> data = getMetadata(); if (!data.containsKey("StreamTitle")) return ""; try { String streamTitle = data.get("StreamTitle"); String title = streamTitle.substring(0, streamTitle.indexOf("-")); return title.trim(); } catch (StringIndexOutOfBoundsException e) { return ""; } } public String getTitle() throws IOException { Map<String, String> data = getMetadata(); if (!data.containsKey("StreamTitle")) return ""; try { String streamTitle = data.get("StreamTitle"); String artist = streamTitle.substring(streamTitle.indexOf("-") + 1); return artist.trim(); } catch (StringIndexOutOfBoundsException e) { return ""; } } public Map<String, String> getMetadata() throws IOException { if (metadata == null) { refreshMeta(); } return metadata; } public void refreshMeta() throws IOException { retreiveMetadata(); } private void retreiveMetadata() throws IOException { URLConnection con = streamUrl.openConnection(); con.setRequestProperty("Icy-MetaData", "1"); con.setRequestProperty("Connection", "close"); //con.setRequestProperty("Accept", null); con.connect(); int metaDataOffset = 0; Map<String, List<String>> headers = con.getHeaderFields(); InputStream stream = con.getInputStream(); if (headers.containsKey("icy-metaint")) { // Headers are sent via HTTP metaDataOffset = Integer.parseInt(headers.get("icy-metaint").get(0)); } else { // Headers are sent within a stream StringBuilder strHeaders = new StringBuilder(); char c; while ((c = (char) stream.read()) != -1) { strHeaders.append(c); if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) { // end of headers break; } } // Match headers to get metadata offset within a stream Pattern p = Pattern.compile("\\r\\n(icy-metaint):\\s*(.*)\\r\\n"); Matcher m = p.matcher(strHeaders.toString()); if (m.find()) { metaDataOffset = Integer.parseInt(m.group(2)); } } // In case no data was sent if (metaDataOffset == 0) { isError = true; return; } // Read metadata int b; int count = 0; int metaDataLength = 4080; // 4080 is the max length boolean inData = false; StringBuilder metaData = new StringBuilder(); // Stream position should be either at the beginning or right after headers while ((b = stream.read()) != -1) { count++; // Length of the metadata if (count == metaDataOffset + 1) { metaDataLength = b * 16; } if (count > metaDataOffset + 1 && count < (metaDataOffset + metaDataLength)) { inData = true; } else { inData = false; } if (inData) { if (b != 0) { metaData.append((char) b); } } if (count > (metaDataOffset + metaDataLength)) { break; } } // Set the data metadata = IcyStreamMeta.parseMetadata(metaData.toString()); // Close stream.close(); } public boolean isError() { return isError; } public URL getStreamUrl() { return streamUrl; } public void setStreamUrl(URL streamUrl) { this.metadata = null; this.streamUrl = streamUrl; this.isError = false; } public static Map<String, String> parseMetadata(String metaString) { Map<String, String> metadata = new HashMap<String, String>(); String[] metaParts = metaString.split(";"); Pattern p = Pattern.compile("^([a-zA-Z]+)=\\'([^\\']*)\\'$"); Matcher m; for (int i = 0; i < metaParts.length; i++) { m = p.matcher(metaParts[i]); if (m.find()) { metadata.put((String) m.group(1), (String) m.group(2)); } } return metadata; } }
A package sorba a te package neved kerül, és természetesen ne feledkezzünk meg az internet permission-ről sem
<uses-permission android:name="android.permission.INTERNET" />