欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android扫描本地音乐文件开发案例分享

程序员文章站 2024-03-02 23:30:58
一、前言 本来觉得so easy,真是没想到,还搞了老半天,搞的我大汗淋漓,要拍桌子摔键盘了。 本想实现的功能是: 通过网易云音乐/百度音乐/qq音乐/酷狗音乐中...

一、前言

本来觉得so easy,真是没想到,还搞了老半天,搞的我大汗淋漓,要拍桌子摔键盘了。
本想实现的功能是:
通过网易云音乐/百度音乐/qq音乐/酷狗音乐中一个api,通过关键词/歌手/歌词来搜索相关歌曲信息,然后在线播放、下载到本地,不过目前来看,使用api还是有一点问题。通过浏览器访问,问题不大,例如下图:

Android扫描本地音乐文件开发案例分享

但是想通过手机访问的时候,问题就出现了,同样的参数,结果很不一样,而且基本搜不到自己想要的,后来换做通过自己的服务器去访问,还是搜不到,后来查了一下资料,暂时也没解决。于是,目前就只是通过扫描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中显示,效果就简单像这个样子,还是那句话,别嫌弃它丑:

Android扫描本地音乐文件开发案例分享

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

另外一个方法,自己测试了一下暂时没扫出来,那就是从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软件编程有所帮助。