Android 自动扫描歌曲,Android扫描本地音乐文件开发案例分享

一、前言

本来觉得so easy,真是没想到,还搞了老半天,搞的我大汗淋漓,要拍桌子摔键盘了。

本想实现的功能是:

通过网易云音乐/百度音乐/QQ音乐/酷狗音乐中一个API,通过关键词/歌手/歌词来搜索相关歌曲信息,然后在线播放、下载到本地,不过目前来看,使用API还是有一点问题。通过浏览器访问,问题不大,例如下图:

e5698e9a863c77969052ab217402b3b3.png

但是想通过手机访问的时候,问题就出现了,同样的参数,结果很不一样,而且基本搜不到自己想要的,后来换做通过自己的服务器去访问,还是搜不到,后来查了一下资料,暂时也没解决。于是,目前就只是通过扫描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 list = new ArrayList<>();

public static List 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中显示,效果就简单像这个样子,还是那句话,别嫌弃它丑:

db60269b85b9f4281dc0290588e20dbd.png

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

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

public static List> 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 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软件编程有所帮助。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Android自带的MediaStore类来扫描本地音乐文件。下面是一个简单的示例代码: ``` private void scanMusicFiles() { // 定义要查询的列 String[] projection = new String[]{ MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.SIZE }; // 定义查询条件,只查询音频文件 String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; // 查询音乐文件 Cursor cursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null ); // 遍历查询结果 if (cursor != null) { while (cursor.moveToNext()) { // 获取音乐文件的信息 long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 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 duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)); // 打印音乐文件的信息 Log.d(TAG, "id: " + id); Log.d(TAG, "path: " + path); Log.d(TAG, "title: " + title); Log.d(TAG, "artist: " + artist); Log.d(TAG, "album: " + album); Log.d(TAG, "duration: " + duration); Log.d(TAG, "size: " + size); } cursor.close(); } } ``` 注意:需要在AndroidManifest.xml文件中添加读取外部存储的权限: ``` <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值