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;
  }

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

(0)

相关推荐

  • 基于Android扫描sd卡与系统文件的介绍

    如果你做过多媒体应用,一定会苦恼过,怎样获取sd卡中的多媒体文件.android还是很强大的,如果你知道怎么调用android的api,万事就ok了. 当手机或模拟器开机时,会调用android的MediaScanner,扫描sd卡和内存里的文件.以下是log信息. 复制代码 代码如下: 12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new media retriever from pid 349<BR> 12-13 15

  • android暂停或停止其他音乐播放器的播放实现代码

    代码如下: 复制代码 代码如下: public static final String PLAYSTATE_CHANGED = "com.android.music.playstatechanged";    public static final String META_CHANGED = "com.android.music.metachanged";    public static final String QUEUE_CHANGED = "com

  • android获取音乐文件的内置专辑图片实现思路及代码

    代码和注释如下: 复制代码 代码如下: private Cursor getCursor(String filePath) { String path = null; Cursor c = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); // System.out.printl

  • Android编程获取sdcard音乐文件的方法

    本文实例讲述了Android编程获取sdcard音乐文件的方法.分享给大家供大家参考,具体如下: 复制代码 代码如下: Cursor  query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder); Uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档. Projection: 指定查询数据库表中的哪几列,

  • Android中扫描多媒体文件操作详解

    这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无法添加到媒体库的问题等.本人将通过对源代码的分析,一一解释这些问题. Android中的多媒体文件扫描机制 Android提供了一个很棒的程序来处理将多媒体文件加入的媒体库中.这个程序就是MediaProvider,现在我们简单看以下这个程序.首先看一下它的Receiver 复制代码 代码如下: <receiver android:name="MediaScanner

  • Android中通过MediaStore获取音乐文件信息方法

    Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户.当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中.在这个程序中,我们不需要关心如何去扫描手机中的文件,只要了解如何查询和使用这些信息就可以了. MediaStore中定义了一系列的数据表格,通过Conten

  • Android编程简单实现雷达扫描效果

    本文实例讲述了Android编程简单实现雷达扫描效果.分享给大家供大家参考,具体如下: 在eoe看到有一篇关于雷达扫描的文章,然后看了下,很简单,但是觉得还有很多可以优化的地方,下面贴出来 package com.example.wave; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; im

  • Android应用中实现选择本地文件与目录的实例分享

    文件选择器 今天给大家分享下文件选择器的作用 , 具体就是获取用户在在SD卡选中的文件/文件夹路径 ,类似于C#中OpenFileDialog控件(对C#的一站式开发还是念念不忘).功能实现起来比较简单,主要是帮助大家节省开发时间. 网上流传较广的一个成品如下 <[Android实例] 文件选择器>, 本文也是根据上面的成品修改而成,使其更易理解,效率更高. 除此之外,主要特色有: 1.我们监听了用户按下Back键的事件,使其返回上一层目录: 2.针对不同的文件类型(文件vs文件夹 , 目标文

  • Android项目中引用本地aar文件的方法

    随着项目越来越多,代码的复用就变得异常重要,这时候就要进行模块化编程,就是把一些通用的组件或者类库做成单独的模块,其他项目直接进行引用就好.针对Android开发最常见的就是Android Library,在Gradle出现之前引用Android Library的方式也很繁琐,但是有了Gradle一切变得非常简单方便. aar 何为aar?大家都知道jar文件把,如果你有一个Android Library项目,可以很容易的导出jar文件,然后在其他项目中很方便的引用,aar和jar类似,区别就是

  • Android中加入名片扫描功能实例代码

    要想实现android手机通过扫描名片,得到名片信息,可以使用脉可寻提供的第三方SDK,即Maketion ScanCard SDK,脉可寻云名片识别服务.他们的官方网站为http://www.maketion.com/. 一.概述 Maketion ScanCardSDK(以下简称SDK)是提供给第三方合作伙伴接入脉可寻云名片识别服务,合作伙伴需要先申请key和secure才可以使用. SDK不能独立运行,使用时需要嵌入到Android的Project中. SDK支持Android2.1版本及

随机推荐