Android实现搜索本地音乐的方法

本文实例为大家分享了Android实现搜索本地音乐展示的具体代码,供大家参考,具体内容如下

首先是扫描本地所有的音频文件,然后全部装进集合当中,接下来就是用ListView展示在屏幕上,大概就是这几个步骤了,接下来细讲

创建一个容器

进行过数据解析的朋友都应该知道JavaBean吧,用来装载解析出来的数据,我们这里同样也要创建一个JavaBean,用来装载扫描到的音频文件,具体的代码是:

/**
 * Created by user on 2016/6/24.
 * 放置音乐
 */
public class Song {
  /**
   * 歌手
   */
  public String singer;
  /**
   * 歌曲名
   */
  public String song;
  /**
   * 歌曲的地址
   */
  public String path;
  /**
   * 歌曲长度
   */
  public int duration;
  /**
   * 歌曲的大小
   */
  public long size;
}

创建一个用来扫描本地音频的工具类

类里面定义一个扫描本地音频的方法,其返回值是一个list集合,集合里面装的泛型就是上一步创建的JavaBean,具体代码如下:

import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;  

import com.duanlian.mymusicplayerdemo.bean.Song;  

import java.util.ArrayList;
import java.util.List;  

/**
 * 音乐工具类,
 */
public class MusicUtils {
  /**
   * 扫描系统里面的音频文件,返回一个list集合
   */
  public static List<Song> getMusicData(Context context) {
    List<Song> list = new ArrayList<Song>();
    // 媒体库查询语句(写一个工具类MusicUtils)
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,
        null, MediaStore.Audio.AudioColumns.IS_MUSIC);
    if (cursor != null) {
      while (cursor.moveToNext()) {
        Song song = new Song();
        song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
        song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
        song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
        song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
        song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
        if (song.size > 1000 * 800) {
          // 注释部分是切割标题,分离出歌曲名和歌手 (本地媒体库读取的歌曲信息不规范)
          if (song.song.contains("-")) {
            String[] str = song.song.split("-");
            song.singer = str[0];
            song.song = str[1];
          }
          list.add(song);
        }
      }
      // 释放资源
      cursor.close();
    }  

    return list;
  }  

  /**
   * 定义一个方法用来格式化获取到的时间
   */
  public static String formatTime(int time) {
    if (time / 1000 % 60 < 10) {
      return time / 1000 / 60 + ":0" + time / 1000 % 60;  

    } else {
      return time / 1000 / 60 + ":" + time / 1000 % 60;
    }  

  }
}

好了,当我们调用这个类的这个扫描的方法,就可以得到一个里面装有本地音频的的list集合了,但是在这之前还得添加一个权限:让这个程序可以读取手机本地的文件,在AndroidManifest.xlm里面添加权限,具体如下:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

数据展示

ListView展示数据需要配合Adapter一起使用,而Adapter里面需要传一个上下文,一个数据源,上下文直接能拿到,数据源上面我们已经拿到了,接下来是写ListView和Adapter的编写,先看看MainActivity的布局文件,非常简单:

<?xml version="1.0" encoding="utf-8"?>
lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.duanlian.mymusicplayerdemo.MainActivity">  

  <TextView
    android:id="@+id/main_textview"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:gravity="center"
    android:text="我的音乐" />
  <ListView
    android:id="@+id/main_listview"
    android:layout_below="@+id/main_textview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
lt;/RelativeLayout>

接下来就是MainActivity里面的编写,具体代码:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;  

import com.duanlian.mymusicplayerdemo.adapter.MyAdapter;
import com.duanlian.mymusicplayerdemo.bean.Song;
import com.duanlian.mymusicplayerdemo.utils.MusicUtils;  

import java.util.ArrayList;
import java.util.List;  

public class MainActivity extends AppCompatActivity {  

  private ListView mListView;
  private List<Song> list;
  private MyAdapter adapter;  

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
  }  

  /**
   * 初始化view
   */
  private void initView() {
     mListView = (ListView) findViewById(R.id.main_listview);
    list = new ArrayList<>();
    //把扫描到的音乐赋值给list
     list = MusicUtils.getMusicData(this);
    adapter = new MyAdapter(this,list);
    mListView.setAdapter(adapter);
  }
}

是不是很简单,就定义一个ListView并且绑定Adapter,接下来就Adapter得编写:

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;  

import com.duanlian.mymusicplayerdemo.MainActivity;
import com.duanlian.mymusicplayerdemo.R;
import com.duanlian.mymusicplayerdemo.bean.Song;
import com.duanlian.mymusicplayerdemo.utils.MusicUtils;  

import java.util.List;  

public class MyAdapter extends BaseAdapter {
  private Context context;
  private List<Song> list;
  public MyAdapter(MainActivity mainActivity, List<Song> list) {
    this.context = mainActivity;
    this.list = list;  

  }  

  @Override
  public int getCount() {
    return list.size();
  }  

  @Override
  public Object getItem(int i) {
    return list.get(i);
  }  

  @Override
  public long getItemId(int i) {
    return i;
  }  

  @Override
  public View getView(int i, View view, ViewGroup viewGroup) {
    ViewHolder holder = null;
    if (view == null) {
      holder = new ViewHolder();
      //引入布局
      view = View.inflate(context, R.layout.item_music_listview, null);
      //实例化对象
      holder.song = (TextView) view.findViewById(R.id.item_mymusic_song);
      holder.singer = (TextView) view.findViewById(R.id.item_mymusic_singer);
      holder.duration = (TextView) view.findViewById(R.id.item_mymusic_duration);
      holder.position = (TextView) view.findViewById(R.id.item_mymusic_postion);
      view.setTag(holder);
    } else {
      holder = (ViewHolder) view.getTag();
    }
    //给控件赋值
    holder.song.setText(list.get(i).song.toString());
    holder.singer.setText(list.get(i).singer.toString());
    //时间需要转换一下
    int duration = list.get(i).duration;
    String time = MusicUtils.formatTime(duration);
    holder.duration.setText(time);
    holder.position.setText(i+1+"");  

    return view;
  }
  class ViewHolder{
    TextView song;//歌曲名
    TextView singer;//歌手
    TextView duration;//时长
    TextView position;//序号  

  }  

}

ListView都需要一个item,具体代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="110dp"
  android:orientation="horizontal"
  android:gravity="center_vertical"
  android:padding="5dp">
  <TextView
    android:id="@+id/item_mymusic_postion"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="1"
    android:gravity="center"
    android:textColor="#0d0c0c"
    android:textSize="18sp" />  

  <RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    >  

    <TextView
      android:id="@+id/item_mymusic_song"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="歌曲名"
      android:textColor="#0d0c0c"
      android:textSize="20dp" />  

    <TextView
      android:id="@+id/item_mymusic_singer"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/item_mymusic_song"
      android:text="歌手"
      android:textColor="#0d0c0c"
      android:textSize="15sp" />  

    <TextView
      android:id="@+id/item_mymusic_duration"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/item_mymusic_song"
      android:layout_marginLeft="15dp"
      android:textColor="#0d0c0c"
      android:layout_toRightOf="@+id/item_mymusic_singer"
      android:text="时间"
      android:textSize="15sp" />
  </RelativeLayout>  

</LinearLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android实现搜索功能并本地保存搜索历史记录
  • Android SearchView搜索框组件的使用方法
  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡
  • Android 百度地图POI搜索功能实例代码
  • android实现读取、搜索联系人的代码
  • Android文本框搜索和清空效果实现代码及简要概述
  • Android拨号盘 支持T9搜索和号码搜索等拨号盘案例
  • Android搜索框通用版
  • Android实现带列表的地图POI周边搜索功能
  • Android搜索框组件SearchView的基本使用方法
(0)

相关推荐

  • Android 百度地图POI搜索功能实例代码

    在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

  • Android实现带列表的地图POI周边搜索功能

    先看效果图:(以公司附近的国贸为中心点) 上面是地图,下面是地理位置列表,有的只有地理位置列表(QQ动态的位置),这是个很常见的功能.它有个专门的叫法:POI周边搜索. 实现: 这个效果实现起来其实很简单,不过需要你先阅读下地图的API,这里使用的是高德地图的Android SDK,SDK的配置这里不作讲解,文末会放一些链接供学习. 思路: 1.利用地图的定位功能,获取用户当前的位置 2.根据获得的位置信息调用POI搜索,获取位置列表 3.ListView展示位置列表 4.用户拖动地图,获取地图

  • Android SearchView搜索框组件的使用方法

    SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过监听器取得用户的输入,当用户点击搜索时,监听器执行实际的搜索. 本文就为大家分享了SearchView搜索框组件的使用方法,供大家参考,具体内容如下 效果: 代码SearchActivity.java package com.jialianjia.bzw.activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.

  • Android搜索框通用版

    之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏. 先看下效果图: 没什么特别的,只是今天要做的就是简单的把搜索框的内容封装一下. 一.分析功能 先考虑一下,搜索框一般都是由一个搜索图标(一般都是一个放大镜),一个输入框和一个清除按钮组成.然后会通过监听输入框的变化去处理清除按钮的显示和隐藏并且去过滤相关的数据.最后去刷新适配器,显示过滤后的数据.基本上搜索框的功能都大同小异. 有了上边的分

  • Android实现搜索功能并本地保存搜索历史记录

    本文实例为大家分享了Android实现搜索功能,并且需要显示搜索的历史记录,供大家参考,具体内容如下 效果图: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点: - 数据库的增删改查操作 - ListView和ScrollView的嵌套冲突解决 - 监听软键盘回车按钮设置为搜索按钮 - 使用TextWatcher( )实时筛选 - 已搜索的关键字再次搜索不重复添加到数据库 - 刚进入页面设置软键盘不因为EditText而自动弹出 代码 RecordSQLiteOpenHel

  • Android搜索框组件SearchView的基本使用方法

    SearchView是android系统中内置的一个搜索框组件,可以很方便在添加在用户界面之上,但是也带来了一些问题,那就是searchview的UI是固定的,定制起来会很麻烦,如果对SearchView的要求比较高,完全可以采用button和EditText自己实现.这里先简单的说说SearchView的使用: main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" x

  • Android文本框搜索和清空效果实现代码及简要概述

    前言 本文实现的效果:文本框输入为空时显示输入的图标;不为空时显示清空的图标,此时点击清空图标能清空文本框内输入文字. 正文 一.实现效果 二.实现代码 绑定事件 复制代码 代码如下: private Drawable mIconSearchDefault; // 搜索文本框默认图标 private Drawable mIconSearchClear; // 搜索文本框清除文本内容图标 @Override protected void onCreate(Bundle savedInstanceS

  • android实现读取、搜索联系人的代码

    代码很简单,就不多废话了 复制代码 代码如下: //读取联系人 public static Uri CONTACTSURI = ContactsContract.Contacts.CONTENT_URI;//联系人     public static void getContactsInfo(Context context,String tag){         String[] projections = new String[]{ContactsContract.Contacts._ID,

  • Android拨号盘 支持T9搜索和号码搜索等拨号盘案例

    之前做通讯录软件,其中在做拨号盘的时候一直为怎么实现T9输入烦恼,上网找了很多帖子,都没有满意的答案.不过最后终于是实现了,看社区内好像也有不少朋友需要,在此分享一下.这个是在我项目中提取出来的拨号盘案例,功能上完全实现了目前其他通讯录中拨号盘的功能,但在加载效率上还有不足,请各位大侠指教. 有图有真相:     目前我用1g单核cpu的索爱mt15i的测试机,1500多的联系人,加载时间大概在8秒左右,当然,一般用户不会有这么多联系人的.由于我做的程序不是在一开始的界面就是拨号盘,所以我在程序

  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡

    一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二.编写MyApplication类 public class MyApplication extends Application { private static MyApplication mInstance = null; public boolean m_bKeyRight = true; pu

随机推荐