千家信息网

MediaStore播放器制作的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,MediaStore播放器制作的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在最初的构思中,我使用的是File
千家信息网最后更新 2026年11月02日MediaStore播放器制作的示例分析

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

在最初的构思中,我使用的是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));

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

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

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

音乐 查询 方法 信息 参数 文件 方式 对象 时长 名称 就是 数据 媒体 实例 属性 数据库 时候 语句 专辑 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 保险科技 互联网保险 互联网新科技 深圳九邦互联网科技有限公司 中关村互联网 科技集团 美国互联网科技巨头监管 科技类互联网 深圳艾佳互联网科技 互联网科技视频素材 科技大学互联网专业好不好 千方科技属于互联网企业吗 崇明区互联网教育科技售后服务 996高科技互联网公司 半导体是互联网高科技吗 工业互联网科技成果转化 珠海东科互联网科技有限公司 全球科技与互联网公司市值变化 中国科技和美国互联网 互联网科技职业技能培训学校 青岛互联网科技园 广州百单互联网科技有限公司 汇久创客互联网科技 科技互联网创业计划书 科技类的互联网平台 佛山市翊博互联网络科技有限公司 洛阳共同富裕互联网科技有限公司 上海钢联属于互联网科技股吗 黑云互联网科技有限公司 陕西九四连强互联网科技有限公司 马化腾互联网科技教学
0