音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到UI界面上。
1、一种方式:解析媒体文件
命名空间:android.media.MediaMetadataRetriever
android提供统一的接口MediaMetadataRetriever解析媒体文件、获取媒体文件中取得帧和元数据(视频/音频包含的标题、格式、艺术家等信息)。
1 MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 2 String str = getExternalStorageDirectory() + "music/hetangyuese.mp3"; 3 mmr.setDataSource(str); 4 // api level 10, 即从GB2.3.3开始有此功能 5 String title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 6 // 专辑名 7 String album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); 8 // 媒体格式 9 String mime = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE); 10 // 艺术家 11 String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); 12 // 播放时长单位为毫秒 13 String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 14 // 从api level 14才有,即从ICS4.0才有此功能 15 String bitrate = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); 16 // 路径 17 String date = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
(1)关于视频缩略图:
2.2 之后:因为用了ThumbnailUtils类:
1 Bitmap b = ThumbnailUtils.createVideoThumbnail(path,Video.Thumbnails.MICRO_KIND); 2 ImageView iv = new ImageView(this);
2.2 之前:
使用MediaMetadataRetriever这个类;还可以通过getFrameAtTime方法取得指定time位置的Bitmap,即可以实现抓图(包括缩略图)功能
但是 里面有个问题
1.0之后 这个类被隐藏了 貌似2.3之后这个类又出现了,但是还可以直接copy源码进去使用:http://blog.csdn.net/lostinai/article/details/7734699 (教程)
1 // 对于视频,取第一帧作为缩略图,也就是怎样从filePath得到一个Bitmap对象。 2 private Bitmap createVideoThumbnail(String filePath) { 3 Bitmap bitmap = null; 4 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 5 try { 6 retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); 7 retriever.setDataSource(filePath); 8 bitmap = retriever.captureFrame(); 9 } catch(IllegalArgumentException ex) { 10 // Assume this is a corrupt video file 11 } catch (RuntimeException ex) { 12 // Assume this is a corrupt video file. 13 } finally { 14 try { 15 retriever.release(); 16 } catch (RuntimeException ex) { 17 // Ignore failures while cleaning up. 18 } 19 } 20 return bitmap; 21 }
(2)关于音乐缩略图:
1 // 对于音乐,取得AlbumImage作为缩略图,还是用MediaMetadataRetriever 2 private Bitmap createAlbumThumbnail(String filePath) { 3 Bitmap bitmap = null; 4 MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 5 try { 6 retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY); 7 retriever.setDataSource(filePath); 8 byte[] art = retriever.extractAlbumArt(); 9 bitmap = BitmapFactory.decodeByteArray(art, 0, art.length); 10 } catch(IllegalArgumentException ex) { 11 } catch (RuntimeException ex) { 12 } finally { 13 try { 14 retriever.release(); 15 } catch (RuntimeException ex) { 16 // Ignore failures while cleaning up. 17 } 18 } 19 return bitmap; 20 }
注意:直接得到Bitmap对象,把图片缩小到合适大小就OK。
这样获取出来的,信息有时候可能有乱码:
1、Java如何获取文件编码格式 (使用第三方库进行处理)
2、自己判断字符串是否有乱码,然后自行处理。
1 private boolean isMessyCode(String strName) { 2 try { 3 Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*"); 4 Matcher m = p.matcher(strName); 5 String after = m.replaceAll(""); 6 String temp = after.replaceAll("\\p{P}", ""); 7 char[] ch = temp.trim().toCharArray(); 8 9 int length = (ch != null) ? ch.length : 0; 10 for (int i = 0; i < length; i++) { 11 char c = ch[i]; 12 if (!Character.isLetterOrDigit(c)) { 13 String str = "" + ch[i]; 14 if (!str.matches("[\u4e00-\u9fa5]+")) { 15 return true; 16 } 17 } 18 } 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 23 return false; 24 }