首先获取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. effectiveC++ 内存管理 学习笔记

    1.尽量使用初始化列表而不要再构造函数里赋值,初始化顺序和声明的顺序一致,一些类型如const,引用等,必须使用初始化.对于非内部数据类型成员对象应当采用初始化表,以获取更高的效率.example:B ...

  2. 使用Junit等工具进行单元测试

    一.类的定义: 类是同一事物的总称,类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类. 二.Junit工具的使用: 1.首先新建一个项目叫JUnit_Test,我们编写一个 ...

  3. ESENT分布式数据存储

    关于ESENT,我能想到最恰当的比喻是,它是Microsoft世界的BerkeleyDB,鲜为人知,很少有.NET开发人员使用它,rhino-queues项目使用就是它,但它的性能和可靠性已经经受住了 ...

  4. 解读ASP.NET 5 & MVC6系列(5):Configuration配置信息管理

    在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容. 基本用法 新版的配置信息机制在Mic ...

  5. Lesson 12 Goodby and good luck

    Text Our neighbour, Captain Charles Alison, will sail from Portsmouth tomorrow. We'll meet him at th ...

  6. 扩展Bootstrap Tooltip插件使其可交互

    最近在公司某项目开发中遇见一特殊需求,请笔者帮助,因此有了本文的插件.在前端开发中tooltip是一个极其常用的插件,它能更好向使用者展示更多的文档等帮助信息.它们通常都是一些静态文本信息.但同事他们 ...

  7. 防刷票机制研究和.NET HttpRequest Proxy

    最近应朋友之约 测试他做的投票网站 防刷票机制能力如何,下面有一些心得和体会. 朋友网站用PHP写的,走的是HttpRequest,他一开始认为IP认证应该就差不多了.但说实话这种很low,手动更换代 ...

  8. linux下使用adb连接android手机

    一.新建文件 cat /etc/udev/rules.d/51-android.rules SUBSYSTEM==" 二.重启 udev sudo /etc/init.d/udev rest ...

  9. bootstrap-popover的配置与灵活应用

    首先罗列一下配置参数: 1.animation true/false 是否动画 2.placement 'right'/'left'/top/bottom/function(){return 'rig ...

  10. edit

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...