团队冲刺第二天

.我在昨天的基础上学习了多音乐的播放,切换音乐,进度条显示。设置按钮上一首和下一首的操作,发现用到了线程方面的知识,我又重新学习了线程。并打算通过SD可以直接使用手机内存中的音乐,但是一直显示SD音乐导入不进去。明天继续bug的修改。

主要代码:

package com.example.keeprunning;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;

public class MusicService {
    //获取SD卡总目录
    //private static final File PATH = Environment.getExternalStorageDirectory();
    String  PATH=Environment.getExternalStorageDirectory().getAbsolutePath();

    //存放找到的所有mp3的绝对路径


    public List<String> musicList;
    //定义多媒体对象
    public MediaPlayer player;
    //当前播放的歌曲在List中的下标,flag为标致
    public int songNum;
    //当前播放的歌曲名
    public String songName;


    //写一个内部类供加载mp3文件的时候调用
    class MusicFilter implements FilenameFilter {
        public boolean accept(File dir, String name) {
            //返回当前目录所有以.mp3结尾的文件
            return (name.endsWith(".mp3"));
        }
    }
    //在MusicService类的无参构造函数中实例化对象,并把这些MP3文件放到musicList中
    public MusicService() {
        super();
        //实例化一个多媒体对象
        player = new MediaPlayer();
        //实例化一个List链表数组
        musicList = new ArrayList<String>();
        try {
            //获取根目录的二级目录Music
            File MUSIC_PATH = new File(PATH, "Music");
            if (MUSIC_PATH.listFiles(new MusicFilter()).length > 0) {
                for (File file : MUSIC_PATH.listFiles(new MusicFilter())) {
                    musicList.add(file.getAbsolutePath());
                }
            }
        } catch (Exception e) {
            Log.i("TAG", "读取文件异常");
        }

    }

    //用setPlayName方法来修改获取到的mp3文件的名字供我们在TextView页面中使用
    public void setPlayName(String dataSource){
        File file=new File(dataSource);
        String name=file.getName();
        int index=name.lastIndexOf(".");
        songName=name.substring(0,index);
    }

    //定义play类实现单首音乐的播放
    public void play(){
        try{
            //重制多媒体
            player.reset();
            //得到当前播放音乐的路径
            String dataSource =musicList.get(songNum);
            //载取歌名
            setPlayName(dataSource);
            //指定参数为音频文件
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //为多媒体对象设置播放路径
            player.setDataSource(dataSource);
            //准备播放
            player.prepare();
            //开始播放
            player.start();

            //setOnCompletionListener当前多媒体对象播放完成时发生的事件
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
                public void onCompletion(MediaPlayer arg0){
                    //如果当前歌曲播放完毕,自动播放下一首
                    next();
                }
            });
        }catch(Exception e){
            Log.v("MusicService", e.getMessage());
        }
    }

    //继续播放
    public void goPlay(){
        int position=getCurrentProgress();
        //设置当前MediaPlayer的播放位置,单位是毫秒
        player.seekTo(position);
        try{
            //同步方式装载流媒体文件
            player.prepare();
        }catch(Exception e){
            e.printStackTrace();
        }
        player.start();
    }

    // 获取当前进度
    public int getCurrentProgress() {
        if (player != null & player.isPlaying()) {
            return player.getCurrentPosition();
        } else if (player != null & (!player.isPlaying())) {
            return player.getCurrentPosition();
        }
        return 0;
    }

    public void next() {
        songNum = songNum == musicList.size() - 1 ? 0 : songNum + 1;
        play();
    }

    public void last() {
        songNum = songNum == 0 ? musicList.size() - 1 : songNum - 1;
        play();
    }
    // 暂停播放
    public void pause() {
        if (player != null && player.isPlaying()){
            player.pause();
        }
    }

    public void stop() {
        if (player != null && player.isPlaying()) {
            player.stop();
            player.reset();
        }
    }
}
View Code
 //为各组事件绑定监听事件
        try {
            setListViewAdapter();//添加文件名字
        } catch (Exception e) {
            Log.i("TAG", "读取信息失败");
        }

        btnStart = (Button) findViewById(R.id.btn_star);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    /**
                     * 引入flag作为标志,当flag为1 的时候,此时player内没有东西,所以执行musicService.play()函数
                     * 进行第一次播放,然后flag自增二不再进行第一次播放
                     * 当再次点击“开始/暂停”按钮次数即大于1 将执行暂停或继续播放goplay()函数
                     */
                    if (flag == 1) {
                        musicService.play();
                        flag++;
                    } else {
                        if (!musicService.player.isPlaying()) {
                            musicService.goPlay();
                        } else if (musicService.player.isPlaying()) {
                            musicService.pause();
                        }
                    }
                } catch (Exception e) {
                    Log.i("LAT", "开始异常!");
                }

            }
        });

        btnStop = (Button) findViewById(R.id.btn_stop);
        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    musicService.stop();
                    flag = 1;//当点击停止按钮时,flag置为1
                    seekBar.setProgress(0);
                    txtInfo.setText("播放已经停止");
                } catch (Exception e) {
                    Log.i("LAT", "停止异常!");
                }

            }
        });

        btnLast = (Button) findViewById(R.id.btn_last);
        btnLast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    musicService.last();
                } catch (Exception e) {
                    Log.i("LAT", "上一曲异常!");
                }

            }
        });

        btnNext = (Button) findViewById(R.id.btn_next);
        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    musicService.next();
                } catch (Exception e) {
                    Log.i("LAT", "下一曲异常!");
                }

            }
        });

        seekBar = (SeekBar) findViewById(R.id.sb);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {//用于监听SeekBar进度值的改变

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {//用于监听SeekBar开始拖动

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {//用于监听SeekBar停止拖动  SeekBar停止拖动后的事件
                int progress = seekBar.getProgress();
                Log.i("TAG:", "" + progress + "");
                int musicMax = musicService.player.getDuration(); //得到该首歌曲最长秒数
                int seekBarMax = seekBar.getMax();
                musicService.player
                        .seekTo(musicMax * progress / seekBarMax);//跳到该曲该秒
                autoChange = true;
                manulChange = false;
            }
        });

    }
View Code
原文地址:https://www.cnblogs.com/hhjing/p/12716446.html