音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到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     }
检查字符串是否乱码,乱码情况下要做相应的处理

相关文章: