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 ...
随机推荐
- 前端网老姚浅谈:怎么学JavaScript?
作者:小不了链接:https://zhuanlan.zhihu.com/p/23265155来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 鉴于时不时,有同学私信问我( ...
- word20161221
S/MIME, Secure Multipurpose Internet Mail Extensions / 安全多用途网际邮件扩展协议 SACL, system access control lis ...
- MongoDB安装
安装 1>设置MongoDB目录 cd /home/apps 附:centOS下创建目录命令 mkdir /home/apps 2>下载mongodb curl -O http ...
- Linux下的压缩和解压缩命令——gzip/gunzip
gzip命令 gzip命令用来压缩文件.gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处".gz"扩展名. gzip是在Linux系统中经常使用的一个对文件进行压 ...
- 饿了么基于Vue2.0的通用组件开发之路(分享会记录)
Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库.今天我们要分享的就是开发 Element 的一些心得. 官网 ...
- jQuery的select相关操作
例: <select class="selector" id="selector"></select> 1.设置value为pxx的项选 ...
- 【Django】--ModelForm组件
ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...
- cornerstone知识点
CornerStone使用教程(配置SVN,HTTP及svn简单使用) 发布时间:2015-01-02 19:54 作者:芳仔小脚印 来源:开源中国 CornerStone是Mac OS X ...
- myeclipse中如何修改项目的名称
第一种:myeclipse通用版 1.打比方,比如复制一个现有的项目,重命名项目名称,这里举例名称重新命名为"劳黑炭" 2.要清楚的是,这里的项目名称重新命名了,但是Web项目本 ...
- iOS 微信支付总结
1.支付流程 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择 ...