码迷,mamicode.com
首页 > 移动开发 > 详细

Android开发:扫描本地音乐文件

时间:2016-05-18 18:43:15      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:

一.前言

本来觉得so easy,真是没想到,还搞了老半天,搞的我大汗淋漓,要拍桌子摔键盘了。
本想实现的功能是:
通过网易云音乐/百度音乐/QQ音乐/酷狗音乐中一个API,通过关键词/歌手/歌词来搜索相关歌曲信息,然后在线播放、下载到本地,不过目前来看,使用API还是有一点问题。通过浏览器访问,问题不大,例如下图:
技术分享
但是想通过手机访问的时候,问题就出现了,同样的参数,结果很不一样,而且基本搜不到自己想要的,后来换做通过自己的服务器去访问,还是搜不到,后来查了一下资料,暂时也没解决。于是,目前就只是通过扫描QQ音乐已经下载的歌曲,来实现播放功能。这篇博文里,我先记录下扫描音乐文件吧,至于播放和下载,后面如果自己整理好了,再贴出来。
关于网易云音乐/百度音乐/QQ音乐/酷狗音乐API的使用,有朋友如果知道适合android的,请求推荐!

二.扫描本地音乐文件

首先通过QQ音乐已经下载好歌。
扫描实现:

//扫描本地音乐
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
    new Thread()
    {
        @Override
        public void run()
        {
            try
            {
            String[] ext = { ".mp3" };
            File file = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.tencent.qqmusic/files/qqmusic/song");//可以把"//////"这一串都去掉,扫面范围是整个SD卡,我嫌慢,而且扫出来很多...不是我想要的歌曲,最后还是直接写成QQ音乐的下载目录了,其实自己的APP支持下载的话,可以把歌曲下载的指定目录,然后扫描这个指定目录就行了~全局扫描的确不太合适,又不是杀毒..
            localMusicList = Common.searchMp3Infos(file,ext);
            hander.sendEmptyMessage(SEARCH_MUSIC_SUCCESS);
            }catch (Exception e){}
            }
        }.start();
}

下面就是Common.searchMp3Infos()的代码

//扫描实现
    static List<String> list = new ArrayList<>();
    public static List<String> searchMp3Infos(File file, String[] ext) {
        if (file != null) {
            if (file.isDirectory()) {
                File[] listFile = file.listFiles();
                if (listFile != null) {
                    for (int i = 0; i < listFile.length; i++) {
                        searchMp3Infos(listFile[i], ext);
                    }
                }
            } else {
                String filename = file.getAbsolutePath();
                for (int i = 0; i < ext.length; i++) {
                    if (filename.endsWith(ext[i])) {
                        list.add(filename);
                        break;
                    }
                }
            }
        }
        return list;
    }

然后在handler里通过适配器在listview中显示,效果就简单像这个样子,还是那句话,别嫌弃它丑:
技术分享

嗯,先把它扫出来吧,显示问题再改~~~

另外一个方法,自己测试了一下暂时没扫出来,那就是从SQLite数据库扫音乐文件,很多朋友都提到了,但是不知道自己的问题出哪里了,只能扫到录音文件~我也贴出来,供参考。

public static List<HashMap<String, Object>> getMp3Infos(Context context)
    {
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
                null, null, null);
        ArrayList mp3Infos = new ArrayList();
        for (int i = 0; i < cursor.getCount(); i++) {
            cursor.moveToNext();
            HashMap<String, Object> musicMap = new HashMap<>();
            long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));//音乐id
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));//音乐标题
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
            String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));//专辑
            long albumid = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));//专辑id
            long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
            long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));//文件大小
            String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//文件路径
            int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐
            if (isMusic != 0) {
                musicMap.put("id",id);
                musicMap.put("title",title);
                musicMap.put("artist",artist);
                musicMap.put("album",album);
                musicMap.put("albumid",albumid);
                musicMap.put("duration",duration);
                musicMap.put("size",size);
                musicMap.put("url",url);
                musicMap.put("isMusic",isMusic);
                mp3Infos.add(musicMap);
            }
        }
        cursor.close();
        return mp3Infos;
    }

Android开发:扫描本地音乐文件

标签:

原文地址:http://blog.csdn.net/chentravelling/article/details/51426101

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!