音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到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类:

 Bitmap  b = ThumbnailUtils.createVideoThumbnail(path,Video.Thumbnails.MICRO_KIND);
ImageView iv = new ImageView(this);

2.2 之前:

使用MediaMetadataRetriever这个类;还可以通过getFrameAtTime方法取得指定time位置的Bitmap,即可以实现抓图(包括缩略图)功能

但是 里面有个问题 
1.0之后 这个类被隐藏了 貌似2.3之后这个类又出现了,但是还可以直接copy源码进去使用:http://blog.csdn.net/lostinai/article/details/7734699 (教程)

  // 对于视频,取第一帧作为缩略图,也就是怎样从filePath得到一个Bitmap对象。
private Bitmap createVideoThumbnail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
retriever.setDataSource(filePath);
bitmap = retriever.captureFrame();
} catch(IllegalArgumentException ex) {
// Assume this is a corrupt video file
} catch (RuntimeException ex) {
// Assume this is a corrupt video file.
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
// Ignore failures while cleaning up.
}
}
return bitmap;
}

(2)关于音乐缩略图:

  // 对于音乐,取得AlbumImage作为缩略图,还是用MediaMetadataRetriever
private Bitmap createAlbumThumbnail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
retriever.setDataSource(filePath);
byte[] art = retriever.extractAlbumArt();
bitmap = BitmapFactory.decodeByteArray(art, 0, art.length);
} catch(IllegalArgumentException ex) {
} catch (RuntimeException ex) {
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
// Ignore failures while cleaning up.
}
}
return bitmap;
}

注意:直接得到Bitmap对象,把图片缩小到合适大小就OK。

这样获取出来的,信息有时候可能有乱码:

1、Java如何获取文件编码格式  (使用第三方库进行处理)

2、自己判断字符串是否有乱码,然后自行处理。

 private boolean isMessyCode(String strName) {
try {
Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
Matcher m = p.matcher(strName);
String after = m.replaceAll("");
String temp = after.replaceAll("\\p{P}", "");
char[] ch = temp.trim().toCharArray(); int length = (ch != null) ? ch.length : 0;
for (int i = 0; i < length; i++) {
char c = ch[i];
if (!Character.isLetterOrDigit(c)) {
String str = "" + ch[i];
if (!str.matches("[\u4e00-\u9fa5]+")) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} return false;
}

检查字符串是否乱码,乱码情况下要做相应的处理

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

创建java bean:

 public class MediaInfo {
private int playDuration = 0;
private String mediaName = "";
private String mediaAlbum = "";
private String mediaArtist = "";
private String mediaYear = "";
private String mFileName = "";
private String mFileType = "";
private String mFileSize = "";
private String mFilePath = ""; public Bitmap getmBitmap() {
return mBitmap;
} public void setmBitmap(Bitmap mBitmap) {
this.mBitmap = mBitmap;
} private Bitmap mBitmap = null; public String getMediaName() {
return mediaName;
} public void setMediaName(String mediaName) {
try {
mediaName =new String (mediaName.getBytes("ISO-8859-1"),"GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.mediaName = mediaName;
} public String getMediaAlbum() {
return mediaAlbum;
} public void setMediaAlbum(String mediaAlbum) {
try {
mediaAlbum =new String (mediaAlbum.getBytes("ISO-8859-1"),"GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.mediaAlbum = mediaAlbum;
} public String getMediaArtist() {
return mediaArtist;
} public void setMediaArtist(String mediaArtist) {
try {
mediaArtist =new String (mediaArtist.getBytes("ISO-8859-1"),"GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.mediaArtist = mediaArtist;
}
}

媒体信息bean

操作类:

 public class MediaInfoProvider {  

         /**
* context
*/
private Context mContext = null; /**
* data path
*/
private static final String dataPath = "/mnt"; /**
* query column
*/
private static final String[] mCursorCols = new String[] {
MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE,
MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA }; /**
* MediaInfoProvider
* @param context
*/
public MediaInfoProvider(Context context) {
this.mContext = context;
} /**
* get the media file info by path
* @param filePath
* @return
*/
public MediaInfo getMediaInfo(String filePath) { /* check a exit file */
File file = new File(filePath);
if (file.exists()) {
Toast.makeText(mContext, "sorry, the file is not exit!",
Toast.LENGTH_SHORT);
} /* create the query URI, where, selectionArgs */
Uri Media_URI = null;
String where = null;
String selectionArgs[] = null; if (filePath.startsWith("content://media/")) {
/* content type path */
Media_URI = Uri.parse(filePath);
where = null;
selectionArgs = null;
} else {
/* external file path */
if(filePath.indexOf(dataPath) < 0) {
filePath = dataPath + filePath;
}
Media_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
where = MediaColumns.DATA + "=?";
selectionArgs = new String[] { filePath };
} /* 查询 */
Cursor cursor = mContext.getContentResolver().query(Media_URI,
mCursorCols, where, selectionArgs, null);
if (cursor == null || cursor.getCount() == 0) {
return null;
} else {
cursor.moveToFirst();
MediaInfo info = getInfoFromCursor(cursor);
printInfo(info);
return info;
}
} /**
* 获取媒体信息
* @param cursor
* @return
*/
private MediaInfo getInfoFromCursor(Cursor cursor) {
MediaInfo info = new MediaInfo(); /* file name */
if(cursor.getString(1) != null) {
info.setmFileName(cursor.getString(1));
}
/* media name */
if(cursor.getString(2) != null) {
info.setMediaName(cursor.getString(2));
}
/* play duration */
if(cursor.getString(3) != null) {
info.setPlayDuration(cursor.getInt(3));
}
/* artist */
if(cursor.getString(4) != null) {
info.setMediaArtist(cursor.getString(4));
}
/* album */
if(cursor.getString(5) != null) {
info.setMediaAlbum(cursor.getString(5));
}
/* media year */
if (cursor.getString(6) != null) {
info.setMediaYear(cursor.getString(6));
} else {
info.setMediaYear("undefine");
}
/* media type */
if(cursor.getString(7) != null) {
info.setmFileType(cursor.getString(7).trim());
}
/* media size */
if (cursor.getString(8) != null) {
float temp = cursor.getInt(8) / 1024f / 1024f;
String sizeStr = (temp + "").substring(0, 4);
info.setmFileSize(sizeStr + "M");
} else {
info.setmFileSize("undefine");
}
/* media file path */
if (cursor.getString(9) != null) {
info.setmFilePath(cursor.getString(9));
} return info;
}
}

Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)的更多相关文章

  1. android之读取联系人信息

    联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...

  2. Android中读取图片EXIF元数据之metadata-extractor的使用

    一.引言及介绍 近期在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享. 本身工作也是常常和处理大图 ...

  3. Android 获取图片exif信息

    使用android api读取图片的exif信息 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  4. Android APP 读取 AndroidManifest.xml 中的版本信息详解

    APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...

  5. Android项目——读取手机联系人信息

    加入读取联系人信息的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> cont ...

  6. Android中读取短信信息

    Android中读取的短信文件有 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /**  * 所有的短信  */ public static final Strin ...

  7. 读取 android sys/下的信息

    读取 android sys/下的信息 https://github.com/ruw/Internet-Services-projects/tree/master/OffloadPredictor/l ...

  8. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  9. JavaWEB中读取配置信息

    第一种方法是使用java.io和java.util包,缺点是路径的概念要清晰, 例子: Properties prop = new Properties(); InputStream in = get ...

随机推荐

  1. nuget的搭建及多源冲突

    为什么使用nuget来管理类库引用就不再阐述,好处真的一抓一把.在使用nuget的时候,我们如果总去访问别人的nuget源,受限于网络情况的好坏,速度真的没法保证,更别说访问国外的源了.那好,我们来自 ...

  2. Maximal Rectangle

    很不好想的一道题,参考:http://blog.csdn.net/doc_sgl/article/details/11832965 分为两步:把原矩阵转为直方图,再用largest rectangle ...

  3. Java图片处理 Thumbnails框架

    一.设置图片的缩放比例或者图片的质量比   第一步:导入maven的jar包 <dependency>     <groupId>net.coobird</groupId ...

  4. 连载 [ LTS + Top ]

    +---[ LTS List ]--->| 1. 每日被自己坑的debugging.. http://www.cnblogs.com/tmzbot/p/5582302.html| 2. [待添加 ...

  5. ffmpeg+x264 Windows MSVC 静态编译

    尝试ubuntu和win下mingw编译版本,但都在Vistual Studio链接时因为依赖 libgcc.a, libmingw.a, libmingwex.a 会与mscrt 有符号冲突. 最后 ...

  6. 算法练习_图的连通性问题(JAVA)

    一.问题 1.问题描述: 有n个点(1...n),输入整数对(8,9),表示8,9点之间存在相互的连接关系. 动态连通性问题--编写一段程序过滤掉所以无意义的整数对,即为在不破坏图连通性的前提下,以最 ...

  7. jQuery的select相关操作

    例: <select class="selector" id="selector"></select> 1.设置value为pxx的项选 ...

  8. WPF DataGrid 性能加载大数据

    WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...

  9. ASP中Lable控件的定位问题

    问题:Lable控件的定位问题:找了好久都没找到可以将Lable控件定位的办法,网上说可以将修改position这个属性来实现定位,可是我始终没找到这个属性. (1)首先,在源代码中添加 style ...

  10. ajax用get刷新页面元素在IE下无效解决~~

    总结一下解决办法: 在IE下用Ajax请求某一页面,通常会因为缓存的原因而返回上一次的结果,造成混乱,[即get方式时,获取数据,因发送参数和地址都一致,故IE浏览器会从缓存中取,而不会去请求服务器端 ...