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

一.前言

本来觉得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;
    }
时间: 2024-10-15 21:00:54

Android开发:扫描本地音乐文件的相关文章

Cursor扫描本地音乐文件,英文名也出现乱码,怎么解决。

问题描述 扫描本地音乐文件并放入List的代码如下: public List<LocalMp3> getListByLocal() { Cursor cursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); List<LocalMp3> localMp3s

扫描IPHONE本地音乐文件,获得音乐名,歌手名代码示例

//扫描本地音乐文件,返回艺术家列表 需要库MediaPlayer.framework -(NSArray*) findArtistList { NSMutableArray *artistList = [[NSMutableArray alloc]init]; MPMediaQuery *listQuery = [MPMediaQuery playlistsQuery];//播放列表 NSArray *playlist = [listQuery collections];//播放列表数组 fo

Android开发---MediaPlayer简单音乐播放器

Android开发-MediaPlayer简单音乐播放器 功能介绍 实现一个简单的播放器,类似网易云音乐形式,功能包括: 播放.暂停,停止,退出功能: 后台播放功能: 进度条显示播放进度.拖动进度条改变进度功能: 播放时图片旋转,显示当前播放时间功能: 界面样式 功能实现 1. MediaPlayer的实现 MediaPlayer常用方法介绍 MediaPlayer的实现包括初始化MediaPlayer,MediaPlayer的功能实现,包括播放.暂停.停止.离开等,具体细节如下: MediaP

Android开发问题之R文件丢失

问题解析:1.有时候我们打开Android工程时,会发现gen文件夹下的R文件丢失了,这种情况的发生一般是发在在导入其他Android工程之后,原因是sdk版本问题:2.如果工程已经在eclipse软件中,可能是xml文件错误导致的. 解决方法:1.找到菜单栏中“项目”(project)选项下的“清理”(clean),然后在弹出的对话框中选择你要清理的工程:2.如果没有效果,可以选中项目名称,右击选择“源代码”->“清理”,确定完成.虽然两者都是清理操作,但感觉效果是不一样的:3.如果还是没有出

android开发SDcard 响应的文件相关处理(一)

android开发相关文件类的处理工具类: 1 package com.gzcivil.utils; 2 3 import java.io.File; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import android.os.Environment; 8 import android.os.StatFs; 9 10 import com.gzcivil.entity.FileEntity; 11 12 /** 13

android 开发-数据存储之文件存储

android的文件存储是通过android的文件系统对数据进行临时的保存操作,并不是持久化数据,例如网络上下载某些图片.音频.视频文件等.如缓存文件将会在清理应用缓存的时候被清除,或者是应用卸载的时候缓存文件或内部文件将会被清除. 以下是开发学习中所写的示例代码,以供日后查阅: xml: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="

[Android Studio] 使用本地 aar 文件

导出aar 首先Android Library项目的gradle脚本只需要在开头声明 apply plugin: 'com.android.library' 之后就和导出apk文件一样的方法,执行 ./gradlew assembleRelease,然后就可以在 build/outputs/aar 文件夹里生成aar文件 引用本地的aar 1: 确保你的 aar文件中没有和现有工程重复的res,包括图片名字,如ic-launcher, string , dimen等,一旦主工程引用了该重复的资源

Android开发,布局xml文件命名注意事项——不能包含任何大写字母

转自:http://blog.sina.com.cn/s/blog_628b45090100zuit.html 在开发Android应用时,会接触到布局文件,一般在 工程名/res/layout/*.xml 目录下,这与网页开发时使用css控制布局类似,主要目的是使布局与程序代码分开,便于布局的修改以及控制. 如果使用eclipse平台开发,每一个Android项目,都会有一个R.java文件,该文件用于标识所有的资源,当资源文件(一般是位于res目录的下的*.xml文件)被修改了,R.java

Android开发中对.gitignore文件的配置

一.配置 .gitignore的原因 被加进“.gitignore”的表示不会被Git跟踪,在实际开发过程中,有很多因素导致有些文件不应该加入版本控制中,如: 不同的电脑,开发软件的版本不同,以及软件的一些配置不同,还有编译生成的文件等等--并且在开发过程中会遇到很多冲突,因此就需要对“.gitignore"文件进行好好的配置. 二. .gitignore语法 首先说明“.gitignore"文件的语法:(详情请查询官方文档) 1. 用#来注释语句,在#后面的内容会被Git忽略 2.