博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)
阅读量:7063 次
发布时间:2019-06-28

本文共 11696 字,大约阅读时间需要 38 分钟。

音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到UI界面上。

1、一种方式:解析媒体文件  

命名空间:android.media.MediaMetadataRetriever 

android提供统一的接口解析媒体文件、获取媒体文件中取得帧和元数据(视频/音频包含的标题、格式、艺术家等信息)。

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源码进去使用: (教程)

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 file11  } 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、  (使用第三方库进行处理)

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     }
检查字符串是否乱码,乱码情况下要做相应的处理

2、二种方式:读取媒体文件数据库(避免乱码)

创建java bean: 

1 public class MediaInfo {   2         private int playDuration = 0;   3         private String mediaName = "";   4         private String mediaAlbum = "";   5         private String mediaArtist = "";   6         private String mediaYear = "";   7         private String mFileName = "";   8         private String mFileType = "";   9         private String mFileSize = "";  10         private String mFilePath = "";  11          12         public Bitmap getmBitmap() {  13                 return mBitmap;  14         }  15   16         public void setmBitmap(Bitmap mBitmap) {  17                 this.mBitmap = mBitmap;  18         }  19   20         private Bitmap mBitmap = null;  21 22         public String getMediaName() {  23                 return mediaName;  24         }  25 26         public void setMediaName(String mediaName) {  27                 try {  28                         mediaName =new String (mediaName.getBytes("ISO-8859-1"),"GBK");  29                 } catch (UnsupportedEncodingException e) {  30                         // TODO Auto-generated catch block  31                         e.printStackTrace();  32                 }  33                 this.mediaName = mediaName;  34         }  35   36         public String getMediaAlbum() {  37                 return mediaAlbum;  38         }  39   40         public void setMediaAlbum(String mediaAlbum) {  41                 try {  42                         mediaAlbum =new String (mediaAlbum.getBytes("ISO-8859-1"),"GBK");  43                 } catch (UnsupportedEncodingException e) {  44                         // TODO Auto-generated catch block  45                         e.printStackTrace();  46                 }  47                 this.mediaAlbum = mediaAlbum;  48         }  49 50         public String getMediaArtist() {  51                 return mediaArtist;  52         }  53 54         public void setMediaArtist(String mediaArtist) {  55                 try {  56                         mediaArtist =new String (mediaArtist.getBytes("ISO-8859-1"),"GBK");  57                 } catch (UnsupportedEncodingException e) {  58                         // TODO Auto-generated catch block  59                         e.printStackTrace();  60                 }  61                 this.mediaArtist = mediaArtist;  62         }  63 }
媒体信息bean

操作类:

1 public class MediaInfoProvider {    2     3         /**   4          * context   5          */    6         private Context mContext = null;    7     8         /**   9          * data path  10          */   11         private static final String dataPath = "/mnt";   12           13         /**  14          * query column  15          */   16         private static final String[] mCursorCols = new String[] {   17                         MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME,   18                         MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION,   19                         MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,   20                         MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE,   21                         MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA };   22    23         /**  24          * MediaInfoProvider  25          * @param context  26          */   27         public MediaInfoProvider(Context context) {   28                 this.mContext = context;   29         }   30    31         /**  32          * get the media file info by path  33          * @param filePath  34          * @return  35          */   36         public MediaInfo getMediaInfo(String filePath) {   37    38                 /* check a exit file */   39                 File file = new File(filePath);   40                 if (file.exists()) {   41                         Toast.makeText(mContext, "sorry, the file is not exit!",   42                                         Toast.LENGTH_SHORT);   43                 }   44                   45                 /* create the query URI, where, selectionArgs */   46                 Uri Media_URI = null;   47                 String where = null;   48                 String selectionArgs[] = null;   49                   50                 if (filePath.startsWith("content://media/")) {   51                         /* content type path */   52                         Media_URI = Uri.parse(filePath);   53                         where = null;   54                         selectionArgs = null;   55                 } else {   56                         /* external file path */   57                         if(filePath.indexOf(dataPath) < 0) {   58                                 filePath = dataPath + filePath;   59                         }   60                         Media_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;   61                         where = MediaColumns.DATA + "=?";   62                         selectionArgs = new String[] { filePath };   63                 }   64                   65                 /* 查询 */   66                 Cursor cursor = mContext.getContentResolver().query(Media_URI,   67                                 mCursorCols, where, selectionArgs, null);   68                 if (cursor == null || cursor.getCount() == 0) {   69                         return null;   70                 } else {   71                         cursor.moveToFirst();   72                         MediaInfo info = getInfoFromCursor(cursor);   73                         printInfo(info);   74                         return info;   75                 }   76         }   77    78         /**  79          * 获取媒体信息 80          * @param cursor  81          * @return  82          */   83         private MediaInfo getInfoFromCursor(Cursor cursor) {   84                 MediaInfo info = new MediaInfo();   85                   86                 /* file name */   87                 if(cursor.getString(1) != null) {   88                         info.setmFileName(cursor.getString(1));   89                 }   90                 /* media name */   91                 if(cursor.getString(2) != null) {   92                         info.setMediaName(cursor.getString(2));   93                 }   94                 /* play duration */   95                 if(cursor.getString(3) != null) {   96                         info.setPlayDuration(cursor.getInt(3));   97                 }   98                 /* artist */   99                 if(cursor.getString(4) != null) {  100                         info.setMediaArtist(cursor.getString(4));  101                 }  102                 /* album */  103                 if(cursor.getString(5) != null) {  104                         info.setMediaAlbum(cursor.getString(5));  105                 }  106                 /* media year */  107                 if (cursor.getString(6) != null) {  108                         info.setMediaYear(cursor.getString(6));  109                 } else {  110                         info.setMediaYear("undefine");  111                 }  112                 /* media type */  113                 if(cursor.getString(7) != null) {  114                         info.setmFileType(cursor.getString(7).trim());  115                 }  116                 /* media size */  117                 if (cursor.getString(8) != null) {  118                         float temp = cursor.getInt(8) / 1024f / 1024f;  119                         String sizeStr = (temp + "").substring(0, 4);  120                         info.setmFileSize(sizeStr + "M");  121                 } else {  122                         info.setmFileSize("undefine");  123                 }  124                 /* media file path */  125                 if (cursor.getString(9) != null) {  126                         info.setmFilePath(cursor.getString(9));  127                 }  128   129                 return info;  130         }  131 }

 

转载地址:http://swill.baihongyu.com/

你可能感兴趣的文章
.NET Project Open Day(2011.11.13)
查看>>
centos 记录用户行为轨迹
查看>>
各角色眼中的性能测试
查看>>
Citrix XenDesktop 引发的学案(四)-与“您的虚拟桌面”之间的连接失败,状态(1030)...
查看>>
mysql-5.6的GTID复制的实现
查看>>
6421B Lab10 网络文件和打印服务的配置与故障排除
查看>>
快速安装配置zabbix_agent端
查看>>
DNS服务的配置与管理(5) 配置转发器
查看>>
AIP(Azure 信息保护)之一:启用与激活服务
查看>>
一步步学WebSocket(3)WebSocket协议格式
查看>>
linux更新内核
查看>>
通过mdadm命令调用内核MD模块实现软Raid
查看>>
为RemoteApp的登录用户(域用户)添加输入法的方法
查看>>
分享Open-E DSS V7 应用系列十篇!
查看>>
分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月6日-5月12日)
查看>>
javascript框架概览备忘
查看>>
产品与技术(人员)间的职责关系
查看>>
企业云桌面-13-为企业新建组织单位
查看>>
SystemCenter2012SP1实践(5)SCVMM管理HyperV
查看>>
Ext JS添加子组件的误区
查看>>