Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)
音乐播放器通常需要获取歌曲的专辑、作者、标题、年代等信息,将这些信息显示到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)的更多相关文章
- android之读取联系人信息
联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...
- Android中读取图片EXIF元数据之metadata-extractor的使用
一.引言及介绍 近期在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享. 本身工作也是常常和处理大图 ...
- Android 获取图片exif信息
使用android api读取图片的exif信息 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...
- Android APP 读取 AndroidManifest.xml 中的版本信息详解
APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...
- Android项目——读取手机联系人信息
加入读取联系人信息的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> cont ...
- Android中读取短信信息
Android中读取的短信文件有 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /** * 所有的短信 */ public static final Strin ...
- 读取 android sys/下的信息
读取 android sys/下的信息 https://github.com/ruw/Internet-Services-projects/tree/master/OffloadPredictor/l ...
- 运用Mono.Cecil 反射读取.NET程序集元数据
CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...
- JavaWEB中读取配置信息
第一种方法是使用java.io和java.util包,缺点是路径的概念要清晰, 例子: Properties prop = new Properties(); InputStream in = get ...
随机推荐
- C#进阶目录
一.Sql语句的性能优化 二.Quartz.NET的介绍 三.Log4.Net的介绍 四.Topshelf的介绍 五.Git的使用 六.IEnumerable接口迭代原理 七.Lambada表达式的演 ...
- KMP模板
参考:http://www.cnblogs.com/c-cloud/p/3224788.html #include<stdio.h> #include<string.h> vo ...
- python 解压 压缩包
转 http://m.blog.csdn.net/blog/wice110956/26597179# 这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar ...
- URI编码解码
.NET string s= System.Web.HttpUtility.UrlEncode("123", System.Text.Encoding.Unicode); //编码 ...
- find命令
http://www.jb51.net/os/RedHat/1307.html find 目录(.代表当前目录) -type d -name "..." f -name &q ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...
- QML杂记
1.QML编写可视化元素,运行后程序窗口上无显示.检查电脑的显卡是否支持OpenGL,如果支持请更新显卡驱动. 2.加载图片显示QML Image: Cannot open.解决在qml.qrc右击添 ...
- NetBeans建立跳过测试构建的快捷方式
在项目浏览器中右键项目->属性,如图进行设置: 此后按下图即可运行自定义行为:
- Swift 定义函数 参数 返回值
定义多参数函数 - 用func声明函数 func name(parameters) -> return type { function body } func halfOpenRangeLen ...
- Python 实现简单的 Web
简单的学了下Python, 然后用Python实现简单的Web. 因为正在学习计算机网络,所以通过编程来加强自己对于Http协议和Web服务器的理解,也理解下如何实现Web服务请求.响应.错误处理以及 ...