How to extract ID3 tag from an mp3 file with android

All your problems with Audio, Video and Images.

How to extract ID3 tag from an mp3 file with android

Postby CiprianU » Fri Oct 24, 2008 3:33 pm

Hi all,

Do you know how to extract ID3 tag (Artist, Album, ... ) from an mp3 file using Android fwk?

Thanks in advance.
CiprianU
Freshman
Freshman
 
Posts: 6
Joined: Fri Oct 24, 2008 11:15 am
Location: Bucharest, Romania

Top

Postby Blacksheep » Mon Oct 27, 2008 11:05 am

Hi,

I write a small MP3-Player just for fun so I had to solve this problem, too.

This is my solution:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2.  
  3.  
  4. MediaScannerConnection msc = new MediaScannerConnection(this,
  5.  
  6.                                 new MediaScannerConnectionClient() {
  7.  
  8.  
  9.  
  10.                                         public void onMediaScannerConnected() {
  11.  
  12.                                                 for (final File file : fileList) {
  13.  
  14.                                                         mpFile = file;
  15.  
  16.                                                         msc.scanFile(mpFile.getAbsolutePath(), null);
  17.  
  18.                                                         Log.d("MSC", mpFile.getAbsolutePath());
  19.  
  20.                                                 }
  21.  
  22.                                         }
  23.  
  24.  
  25.  
  26.                                         public void onScanCompleted(String path, Uri uri) {
  27.  
  28.                                                 Log.d("MPSCAN", "Complete"
  29.  
  30.                                                                 + MediaStore.getMediaScannerUri());
  31.  
  32.                                                 msc.disconnect();
  33.  
  34.                                         }
  35.  
  36.  
  37.  
  38.                                 });
  39.  
  40.  
  41.  
  42.                 msc.connect();
  43.  
  44.  
  45.  
  46.                 Uri Uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //uri to sd-card
  47.  
  48.                 String[] Selection = new String[] {
  49.  
  50.                                 android.provider.MediaStore.Audio.Media._ID,
  51.  
  52.                                 android.provider.MediaStore.Audio.Media.TITLE,
  53.  
  54.                                 android.provider.MediaStore.Audio.Media.DATA,
  55.  
  56.                                 android.provider.MediaStore.Audio.Media.ARTIST,
  57.  
  58.                                 android.provider.MediaStore.Audio.Media.ALBUM, };
  59.  
  60.  
  61.  
  62.                 Cursor mCursor = managedQuery(Uri, Selection,null, null, null);
  63.  
  64.  
  65.  
  66.                 mCursor.moveToFirst();
  67.  
  68.                
  69.  
  70.                 while(mCursor.moveToNext()) {
  71.  
  72.                         mp3List.add(mCursor.getString(mCursor.getColumnIndexOrThrow("ARTIST"))); //Adds the artist to the list
  73.  
  74.                 }
  75.  
  76.  
Parsed in 0.035 seconds, using GeSHi 1.0.8.4


Cya
Blacksheep
Blacksheep
Freshman
Freshman
 
Posts: 2
Joined: Mon Oct 27, 2008 10:55 am

Postby CiprianU » Tue Oct 28, 2008 10:19 am

Hi,

Thanks it seems to work, but i don't know why when i add more audio files to sd card, the order is messed up, i think it is because i don't have the same order in my list as it is on sd card, i'll figure it out by myself.
Once again thanks a lot for you reply, it really helped me ;)
CiprianU
Freshman
Freshman
 
Posts: 6
Joined: Fri Oct 24, 2008 11:15 am
Location: Bucharest, Romania

Postby Blacksheep » Wed Oct 29, 2008 3:00 pm

Hi,

there is an easier solution for this problem. I've found this after research the sourcecode of the google musicplayer.

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2.  
  3.  
  4. ContentResolver resolver = getBaseContext().getContentResolver();
  5.  
  6.                
  7.  
  8.                 Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String [] {"ARTIST"}, null, null, null);
  9.  
  10.  
  11.  
  12.                 while(cursor.moveToNext()) {
  13.  
  14.                         Log.d("TEST", cursor.getString(0));
  15.  
  16.                 }
  17.  
  18.  
Parsed in 0.032 seconds, using GeSHi 1.0.8.4


Cya

Blacksheep
Blacksheep
Freshman
Freshman
 
Posts: 2
Joined: Mon Oct 27, 2008 10:55 am

Re: How to extract ID3 tag from an mp3 file with android

Postby chris_abyi » Fri Feb 25, 2011 3:43 pm

How-can I retrieve the metadata of one particular file then?

Thanks,
Chris
chris_abyi
Freshman
Freshman
 
Posts: 3
Joined: Fri Feb 25, 2011 3:19 pm

Re: How to extract ID3 tag from an mp3 file with android

Postby vijethav » Mon May 16, 2011 5:43 am

Can i get the full source code for the same??
vijethav
Freshman
Freshman
 
Posts: 3
Joined: Thu Apr 07, 2011 6:15 am
Location: Bangalore, India

Top

Re: How to extract ID3 tag from an mp3 file with android

Postby whytopersist » Mon Sep 05, 2011 10:54 am

Hello,everybody.I am a newer here.I like to make friends.If u are the people that like to make friends too,just contact me.Haha.

Coach outlet | Coach Handbags | Coach Bags
whytopersist
Freshman
Freshman
 
Posts: 6
Joined: Mon Sep 05, 2011 10:37 am

Re: How to extract ID3 tag from an mp3 file with android

Postby khaitt » Tue Sep 06, 2011 5:36 pm

I found a java class can retrieve ID3 tag from stream. I think sample with file

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.net.URL;
  4. import java.net.URLConnection;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10.  
  11. public class IcyStreamMeta {
  12.  
  13.         protected URL streamUrl;
  14.         private Map<String, String> metadata;
  15.         private boolean isError;
  16.  
  17.         public IcyStreamMeta(URL streamUrl) {
  18.                 setStreamUrl(streamUrl);
  19.  
  20.                 isError = false;
  21.         }
  22.  
  23.         /**
  24.          * Get artist using stream's title
  25.          *
  26.          * @return String
  27.          * @throws IOException
  28.          */
  29.         public String getArtist() throws IOException {
  30.                 Map<String, String> data = getMetadata();
  31.  
  32.                 if (!data.containsKey("StreamTitle"))
  33.                         return "";
  34.  
  35.                 String streamTitle = data.get("StreamTitle");
  36.                 String title = streamTitle.substring(0, streamTitle.indexOf("-"));
  37.                 return title.trim();
  38.         }
  39.  
  40.         /**
  41.          * Get title using stream's title
  42.          *
  43.          * @return String
  44.          * @throws IOException
  45.          */
  46.         public String getTitle() throws IOException {
  47.                 Map<String, String> data = getMetadata();
  48.  
  49.                 if (!data.containsKey("StreamTitle"))
  50.                         return "";
  51.  
  52.                 String streamTitle = data.get("StreamTitle");
  53.                 String artist = streamTitle.substring(streamTitle.indexOf("-")+1);
  54.                 return artist.trim();
  55.         }
  56.  
  57.         public Map<String, String> getMetadata() throws IOException {
  58.                 if (metadata == null) {
  59.                         refreshMeta();
  60.                 }
  61.  
  62.                 return metadata;
  63.         }
  64.  
  65.         public void refreshMeta() throws IOException {
  66.                 retreiveMetadata();
  67.         }
  68.  
  69.         private void retreiveMetadata() throws IOException {
  70.                 URLConnection con = streamUrl.openConnection();
  71.                 con.setRequestProperty("Icy-MetaData", "1");
  72.                 con.setRequestProperty("Connection", "close");
  73.                 con.setRequestProperty("Accept", null);
  74.                 con.connect();
  75.  
  76.                 int metaDataOffset = 0;
  77.                 Map<String, List<String>> headers = con.getHeaderFields();
  78.                 InputStream stream = con.getInputStream();
  79.  
  80.                 if (headers.containsKey("icy-metaint")) {
  81.                         // Headers are sent via HTTP
  82.                         metaDataOffset = Integer.parseInt(headers.get("icy-metaint").get(0));
  83.                 } else {
  84.                         // Headers are sent within a stream
  85.                         StringBuilder strHeaders = new StringBuilder();
  86.                         char c;
  87.                         while ((c = (char)stream.read()) != -1) {
  88.                                 strHeaders.append(c);
  89.                                 if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) {
  90.                                         // end of headers
  91.                                         break;
  92.                                 }
  93.                         }
  94.  
  95.                         // Match headers to get metadata offset within a stream
  96.                         Pattern p = Pattern.compile("\\r\\n(icy-metaint):\\s*(.*)\\r\\n");
  97.                         Matcher m = p.matcher(strHeaders.toString());
  98.                         if (m.find()) {
  99.                                 metaDataOffset = Integer.parseInt(m.group(2));
  100.                         }
  101.                 }
  102.  
  103.                 // In case no data was sent
  104.                 if (metaDataOffset == 0) {
  105.                         isError = true;
  106.                         return;
  107.                 }
  108.  
  109.                 // Read metadata
  110.                 int b;
  111.                 int count = 0;
  112.                 int metaDataLength = 4080; // 4080 is the max length
  113.                 boolean inData = false;
  114.                 StringBuilder metaData = new StringBuilder();
  115.                 // Stream position should be either at the beginning or right after headers
  116.                 while ((b = stream.read()) != -1) {
  117.                         count++;
  118.  
  119.                         // Length of the metadata
  120.                         if (count == metaDataOffset + 1) {
  121.                                 metaDataLength = b * 16;
  122.                         }
  123.  
  124.                         if (count > metaDataOffset + 1 && count < (metaDataOffset + metaDataLength)) {                         
  125.                                 inData = true;
  126.                         } else {                               
  127.                                 inData = false;                        
  128.                         }                              
  129.                         if (inData) {                          
  130.                                 if (b != 0) {                                  
  131.                                         metaData.append((char)b);                              
  132.                                 }                      
  133.                         }                              
  134.                         if (count > (metaDataOffset + metaDataLength)) {
  135.                                 break;
  136.                         }
  137.  
  138.                 }
  139.  
  140.                 // Set the data
  141.                 metadata = IcyStreamMeta.parseMetadata(metaData.toString());
  142.  
  143.                 // Close
  144.                 stream.close();
  145.         }
  146.  
  147.         public boolean isError() {
  148.                 return isError;
  149.         }
  150.  
  151.         public URL getStreamUrl() {
  152.                 return streamUrl;
  153.         }
  154.  
  155.         public void setStreamUrl(URL streamUrl) {
  156.                 this.metadata = null;
  157.                 this.streamUrl = streamUrl;
  158.                 this.isError = false;
  159.         }
  160.  
  161.         public static Map<String, String> parseMetadata(String metaString) {
  162.                 Map<String, String> metadata = new HashMap();
  163.                 String[] metaParts = metaString.split(";");
  164.                 Pattern p = Pattern.compile("^([a-zA-Z]+)=\\'([^\\']*)\\'$");
  165.                 Matcher m;
  166.                 for (int i = 0; i < metaParts.length; i++) {
  167.                         m = p.matcher(metaParts[i]);
  168.                         if (m.find()) {
  169.                                 metadata.put((String)m.group(1), (String)m.group(2));
  170.                         }
  171.                 }
  172.  
  173.                 return metadata;
  174.         }
  175. }
Parsed in 0.054 seconds, using GeSHi 1.0.8.4
khaitt
Freshman
Freshman
 
Posts: 6
Joined: Sat Feb 26, 2011 5:32 am

Top

Return to Multimedia Problems

Who is online

Users browsing this forum: No registered users and 14 guests