MediaStore播放器制作的示例分析

MediaStore播放器制作的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联坚信:善待客户,将会成为终身客户。我们能坚持多年,是因为我们一直可值得信赖。我们从不忽悠初访客户,我们用心做好本职工作,不忘初心,方得始终。十多年网站建设经验创新互联是成都老牌网站营销服务商,为您提供网站制作、成都网站建设、网站设计、H5开发、网站制作、高端网站设计、微信平台小程序开发服务,给众多知名企业提供过好品质的建站服务。

    在最初的构思中,我使用的是File类递归遍历SD卡中的所有文件,然后筛选出以".mp3"格式结尾的文件,放入一个map.然后将map放入List,让media加载.

    但是,发现这样的方法耗时比较长,容易出现"卡住"的现象,然后就想将List永久化存到本地,但是发现如果有几百首歌的话,文件太大了,非常占内存控件.在查阅了一些资料后,发现android手机自身就有一个媒体库,可以直接查询.在多次尝试后,终于成功读取文件.这里做一个笔记.

一,获取ContextResolver实例;

方法:ContexrResolver cr=context.getContextResolver();

解释:context 表示Activity.this的这种context,就是要进行操作的Activity中的Context.

当使用getContextResolver();方法得到ContextResolver对象后,就可以直接查询了.

二,使用Cursor对象;

方法:

1,Cursor c=cr.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder)

这里的cr就是前面得到的ContextResolver对象;这种方式必须先实例化ContextResolver对象.

那么,能不能直接实例出来呢?可以啊的哟~

2,Cursor c=context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder)

只要将context.getContextResolver()直接使用就可以了.两种方式不会出错,根据实际情况使用不同的方式吧.

参数的意义:

Uri:指明要查询的数据库名称加上表的名称,从MediaStore中可以找到相应信息的参数,具体请参考开发文档。
Projection: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
selection: 指定查询条件
selectionArgs:参数selection里有 ?这个符号是,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null。
SortOrder:指定查询结果的排列顺序

三,MediaStore数据库

主语句:

MediaStore.Audio :存放音频信息    MediaStore.Image :存放图片信息    MediaStoue.Video :存放视频信息

这三个是基本的三大文件信息,每个类后面还有许多方法和参数.目前我用到的是音频信息,其他的还没用到,想来方法应该差不多.

1,MediaStore.Audio查询参数:

首先我们要查询的是媒体文件,就是Media类,所以在主语句后面加上:Media

变成了:MediaStore.Audio.Media;

好,现在我们要查询的是媒体的一些信息,这里我搜集了一些常用的属性大家可以参考一下:

        MediaStore.Audio.Media._ID;         //内部ID

MediaStore.Audio.Media.DISPLAY_NAME;//音乐名称

MediaStore.Audio.Media.TITLE;       //音乐标题

MediaStore.Audio.Media.ARTIST;      //演唱者

MediaStore.Audio.Media.ALBUM;       //所属专辑

MediaStore.Audio.Media.DURATION;    //音乐时长

MediaStore.Audio.Media.DATA;        //音乐路径

以上是一些查询文件时常用的属性.那么我们如何使用这些属性呢?

我搜到查询两种方式:

第一种:

    这里我使用的就是直接将ContextResolver对象放在语句里面.

    在获取音乐时长的时候要注意一点,这里的时长是没有转换的,我也不知道是按秒还是毫秒,反正打印出来老长一串.那么,我们就需要转化一下:

public class tools {
	/**
	 * 转换时间
	 * 
	 * @param time
	 * @return
	 */
	public static String formatTime(long time) {
		String min = time / (1000 * 60) + "";
		String sec = time % (1000 * 60) + "";
		if (min.length() < 2) {
			min = "0" + time / (1000 * 60) + "";
		} else {
			min = time / (1000 * 60) + "";
		}
		if (sec.length() == 4) {
			sec = "0" + (time % (1000 * 60)) + "";
		} else if (sec.length() == 3) {
			sec = "00" + (time % (1000 * 60)) + "";
		} else if (sec.length() == 2) {
			sec = "000" + (time % (1000 * 60)) + "";
		} else if (sec.length() == 1) {
			sec = "0000" + (time % (1000 * 60)) + "";
		}
		return min + ":" + sec.trim().substring(0, 2);
	}
}

啊~不是我写的,网上抄来的.哈哈哈.可以看到在获取时长的那一段之前我就用了.

第一种方法,个人感觉比较清晰一点.

public static List> findMusicFileUseCuesor(
			Context context) {
		Cursor cursor = context.getContentResolver().query(
				MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
				MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
		List> list = new ArrayList>();
		if (cursor.moveToFirst()) {
			do {
				Map map = new HashMap();
				// 获得音乐ID
				map.put("_id",
						cursor.getString(
								cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID))
								.toString());
				// 获得音乐名称
				map.put("name",
						cursor.getString(cursor
								.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
				// 获得音乐标题
				map.put("tittle", cursor.getString(cursor
						.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)));
				// 获得音乐歌手
				map.put("artist", cursor.getString(cursor
						.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)));
				// 获得音乐专辑
				map.put("album", cursor.getString(cursor
						.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)));
				// 获得音乐时长
				map.put("duration",
						tools.formatTime(cursor.getLong(cursor
								.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION))));
				// 获得音乐路径
				map.put("path", cursor.getString(cursor
						.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
				list.add(map);
			} while (cursor.moveToNext());
		}
		if (list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				System.out.println("list :---->" + list.get(i).toString());
			}

			return list;
		}
		return null;
	}

第二种方法:

	public static List> findMusicFileFromPhone(
			Context context) {

		Cursor cursor = context.getContentResolver().query(Parameter.MEDIA_URI,
				Parameter.MEDIA_PROJECTION, Parameter.MEDIA_SELECTION,
				Parameter.MEDIA_SELECTIONARGS, null);
		List> musicDate = new ArrayList>();
		while (cursor.moveToNext()) {
			Map map = new HashMap();
			map.put("tittle", cursor.getString(0));
			map.put("artist", cursor.getString(1));
			map.put("durtion", tools.formatTime(cursor.getLong(2)));
			map.put("path", cursor.getString(3));
			musicDate.add(map);
		}
		if (musicDate.size() > 0) {
			return musicDate;
		} else {
			System.out.println("musicDate :" + musicDate.size());
			return null;

		}

	}	

第二个方法的参数:

public static final Uri MEDIA_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

public static final String[] MEDIA_PROJECTION = {
			    MediaStore.Audio.Media.TITLE,
			    MediaStore.Audio.Media.ARTIST,
			    MediaStore.Audio.Media.DURATION,
			    MediaStore.Audio.Media.DATA };
			    
public static final String[] MEDIA_SELECTIONARGS = { "audio/mpeg","audio/x-ms-wma" };

public static final String MEDIA_SELECTION = MediaStore.Audio.Media.MIME_TYPE+ "=? or " + MediaStore.Audio.Media.MIME_TYPE + "=?";

这里在后两句话是什么意思我大概猜得到,但还是希望大牛能给解释一下...

特别是最后一句,应该是筛选类型,网上看说"?"的地方可以自己定义,可以我一改这代码就报错了.不知道为啥....我试过.MP3和MP3小写的也试过...=.=求科普..

这种方式呢,我觉得一是看起来比较乱..(好吧,其实是我写的不好).二呢,总觉得在写的时候写死数据不太好,比如:

map.put("tittle", cursor.getString(0));

如果参数顺序改了的话,那就逗逼了...

但是这种方式在更新,增加,删除,操作的时候比较方便。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


本文名称:MediaStore播放器制作的示例分析
当前链接:http://scyanting.com/article/ppspdd.html