首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中):

    /**
    * 读取目录中的Mp3文件的名字和大小
    */
    public List<Mp3Info> getMp3Files(String path) {
      SDCardRoot = Environment.getExternalStorageDirectory()
        .getAbsolutePath(); //获取SD卡的路径名
      List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
      File file = new File(SDCardRoot + File.separator + path);
      File[] files = file.listFiles();
      for (int i = 0; i < files.length; i++) {
        if (files[i].getName().endsWith(".mp3")) {
          Mp3Info mp3Info = new Mp3Info();
          mp3Info.setMp3Name(files[i].getName());
          mp3Info.setMp3Size(files[i].length() + "");
          mp3Infos.add(mp3Info);  //此mp3Info对象中包含mp3文件名和文件大小
        }
      }
      return mp3Infos;
    }

  当前Activity继承自ListActivity,在此Activity的onResume方法中调用getMp3Files()方法,获取路径下的Mp3文件

    @Override
    protected void onResume() {
      FileUtils fileUtils = new FileUtils();
      mp3Infos = fileUtils.getMp3Files("mp3/");
      List<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
      for(Iterator iterator = mp3Infos.iterator();iterator.hasNext();){
        Mp3Info mp3Info = (Mp3Info) iterator.next();
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("mp3_name", mp3Info.getMp3Name());
        map.put("size_id", mp3Info.getMp3Size());
        list.add(map);
      }
      SimpleAdapter simpleAdapter = new SimpleAdapter(this,list,R.layout.mp3info_item,new String[]{"mp3_name","size_id"},new int[]                {R.id.mp3_name,R.id.size_id});    //mp3info_item.xml文件中仅有两个TextView,id为mp3_name和size_id
      setListAdapter(simpleAdapter);
      super.onResume();
    }

  当点击当前Activity中的某一行时,播放当前行的Mp3文件:

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
      if(mp3Infos != null){
        Mp3Info mp3Info = mp3Infos.get(position);
        Intent intent = new Intent();
        intent.putExtra("mp3Info", mp3Info);
        intent.setClass(this,PlayerActivity.class);
        startActivity(intent);
      }
      super.onListItemClick(l, v, position, id);
    }

    PlayerActivity.class类中通过Service来播放选中的Mp3文件,定义如下:

      public class PlayerActivity extends Activity {

        private ImageButton beginButton = null;
        private ImageButton pauseButton = null;
        private ImageButton stopButton = null;
        private Mp3Info mp3Info = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          setContentView(R.layout.player);
          super.onCreate(savedInstanceState);
          Intent intent = getIntent();
          mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
          beginButton = (ImageButton) findViewById(R.id.begin);
          pauseButton = (ImageButton) findViewById(R.id.pause);
          stopButton = (ImageButton) findViewById(R.id.stop);
          ButtonClickListener listener = new ButtonClickListener();
          beginButton.setOnClickListener(listener);
          pauseButton.setOnClickListener(listener);
          stopButton.setOnClickListener(listener);
        }

      class ButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
          if (v.getId() == R.id.begin) { // 播放按键
            //创建一个intent对象,通知Service开始播放MP3
            Intent intent = new Intent();
            intent.setClass(PlayerActivity.this, PlayerService.class);
            intent.putExtra("mp3Info", mp3Info);
            intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
            //启动Service
            startService(intent);
          } else if (v.getId() == R.id.pause) {
            //通知Service暂停播放MP3
            Intent intent = new Intent();
            intent.setClass(PlayerActivity.this, PlayerService.class);
            intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);
            startService(intent);
          } else if (v.getId() == R.id.stop) {
            //通知Service停止MP3文件
            Intent intent = new Intent();
            intent.setClass(PlayerActivity.this, PlayerService.class);
            intent.putExtra("MSG", AppConstant.PlayerMsg.STOP_MSG);
            startService(intent);
          }
        }

      }
    }

  PlayerService定义如下:

    public class PlayerService extends Service {

      private boolean isPlaying = false;
      private boolean isPause = false;
      private boolean isReleased = false;
      private MediaPlayer mediaPlayer = null;
      private Mp3Info mp3Info = null;
      private ArrayList<Queue> queues = null;

      @Override
      public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
      }

      // 每次从Activity向Service发送intent对象时,触发该事件
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
        int MSG = intent.getIntExtra("MSG", 0);
        if (mp3Info != null) {
          if (MSG == AppConstant.PlayerMsg.PLAY_MSG) {
            play(mp3Info);
          }
        }
        else{
          if(MSG == AppConstant.PlayerMsg.PAUSE_MSG){
            pause();
          }
          else if(MSG == AppConstant.PlayerMsg.STOP_MSG){
            stop();
          }
        }
        return super.onStartCommand(intent, flags, startId);
      }
      private void play(Mp3Info mp3Info){
        if(!isPlaying){
          String path = getMp3Path(mp3Info);
          mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
          mediaPlayer.setLooping(true);   //设置歌曲循环播放
          mediaPlayer.start();
          isPlaying = true;
          isReleased = false;
        }
      }

      private void pause(){
        if(mediaPlayer != null){
          if(isPlaying){
            mediaPlayer.pause();
          } else{
            mediaPlayer.start();
          }
          isPlaying = isPlaying ? false : true;
        }
      }
      private void stop(){
        if(mediaPlayer!=null){
          if(isPlaying){
            if(!isReleased){
              mediaPlayer.stop();
              mediaPlayer.release();
              isReleased = true;
              isPlaying = false;
            }
          }
        }
      }
      private String getMp3Path(Mp3Info mp3Info){
        String SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
        String path = SDCardRoot + File.separator + "mp3" + File.separator + mp3Info.getMp3Name();
        return path;
      }

读取SD卡文件夹下的MP3文件和播放MP3文件的更多相关文章

  1. 飞鱼相册笔记(1)----外置SD卡文件夹名称不区分大小写

    飞鱼相册笔记(1)----外置SD卡文件夹名称不区分大小写 在飞鱼相册发布的第一个测试版中,很多用户表示无法查看外置SD卡中的照片.乍一听觉得加个外置SD卡的根目录,然后在扫描所有图片的时候把这个根目 ...

  2. Android得到SD卡文件夹大小以及删除文件夹操作

    float cacheSize = dirSize(new File(Environment.getExternalStorageDirectory() + AppConstants.APP_CACH ...

  3. 遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包

    List<PDFPATH> pdfpath = new List<PDFPATH>(); List<string> ziplist = new List<st ...

  4. Java 遍历指定文件夹及子文件夹下的文件

    Java 遍历指定文件夹及子文件夹下的文件 /** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @p ...

  5. JAVA中删除文件夹下及其子文件夹下的某类文件

    ##定时删除拜访图片 ##cron表达式 秒 分 时 天 月 ? ##每月1日整点执行 CRON1=0 0 0 1 * ? scheduled.enable1=false ##图片路径 filePat ...

  6. 通过ftp同步服务器文件:遍历文件夹所有文件(含子文件夹、进度条);简单http同步服务器文件实例

    该代码主要实现,指定ftp服务地址,遍历下载该地址下所有文件(含子文件夹下文件),并提供进度条显示:另外附带有通过http地址方式获取服务器文件的简单实例 废话不多说,直接上代码: 1.FTPHelp ...

  7. 安卓下对SD卡文件的读写

    为SD下的操作文件,封装了一些类: package ujs.javawritedata; import java.io.File; import java.io.FileInputStream; im ...

  8. asp.net(C#)读取文件夹和子文件夹下所有文件,绑定到GRIDVIEW并排序 .

    Asp部分: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyFiles ...

  9. FILE文件删除操作(删除指定文件夹下所有文件和文件夹包括子文件夹下所有文件和文件夹),就是删除所有

    2018-11-05  19:42:08开始写 选择 删除 1.FileUtils.java类 import java.io.File;//导入包 import java.util.List;//导入 ...

随机推荐

  1. Red Hat5.5 install Generic mysql-5.7.10

    1.确认以下依赖包已安装 [ncurses ncurses-devel openssl-devel bison autoconf automake bison gcc m4 libtool make ...

  2. Node.js 框架

    Node.js的是一个JavaScript平台,它允许你建立大型的Web应用程序.  Node.js的框架平台使用JavaScript作为它的脚本语言来构建可伸缩的应用. 当涉及到Web应用程序的开发 ...

  3. TaintDroid深入剖析之启动篇

    ​1 背景知识 1.1   Android平台软件动态分析现状 众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外.而随着软件加固.混淆技术的不 ...

  4. HTML5- Canvas入门(二)

    上篇文章我们了解了canvas的定义.获取和基础的绘图操作,其中的绘图功能我们讲解了线段绘制.上色.描边等方面知识点. 今天我们来讲讲矩形(Rectangle)和多边形的绘制. 矩形的绘制一共有两个口 ...

  5. 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: B ...

  6. Hadoop学习笔记——搭建

    一搭建环境列表 操作系统:centos6.5 64位 JDK环境:jdk1.7.0_71 hadoop版本:社区版本2.7.2,hadoop-2.7.2-src.tar.gz 主机名 ip 角色 用户 ...

  7. Python virtualenv with Sublime Text 3

    背景介绍 最近喜欢上了Sublime编辑器,刚开始学着用.不过对我这个python狂人来讲,首要问题是需要sublime支持python virtualenv包的导入.所以我就找了google最后找到 ...

  8. MyBatis参数绑定规则及原理分析

    MyBatis参数的传递有几种不同的方法,本文通过测试用例出发,对其中的方式进行总结和说明,并对其部分源码进行分析. 一.测试用例(环境参考之前博客SSM接口编程一文 http://www.cnblo ...

  9. Leetcode-2 Add Two Numbers

    #2. Add Two Numbers You are given two linked lists representing two non-negative numbers. The digits ...

  10. jQuery源码分析系列(30) : Ajax 整体结构

    开头引用一段 想起一句话:前端研究,研究个屁~ 的确如此呀.补充下联:前端设计,设计个屁~ 前端目前最大的困境是,如 HTML 一样,无论你承不承认,市场上并不太需要 HTML 高手 其实这里引发一个 ...