Android入门教程 MediaPlayer教程【使用进度条】

目标:获取手机中的歌曲,并使用MediaPlayer播放歌曲

这里写图片描述

第一步:创建适配器控件

第二步:创建适配器

第三步:绑定适配器

第四步:为MediaPlayer创建播放、暂停、上一曲、下一曲、停止方法

第五步:使用Thread和SeekBar实现进度条

MainActivity

public class MainActivity extends Activity {

    private ListView musicListView;
    // 资源获取器
    private ContentResolver resolver;
    private List<MusicVO> musicList = new ArrayList<MusicVO>();
    private MediaPlayer mediaPlayer;
    private int currentPosition;
    private Button pre;
    private Button next;
    private Button play;
    private Button stop;
    private SeekBar seekbar;
    private Thread thread;
    //线程标志位
    private boolean isStop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 实例化listview
        musicListView = (ListView) findViewById(R.id.musiclistview);

        // 初始化数据
        initData();

        // 创建适配器
        MusicAdapter adapter = new MusicAdapter(this, musicList);
        // 绑定适配器
        musicListView.setAdapter(adapter);

        // 实例化MediaPlayer
        mediaPlayer = new MediaPlayer();

        // 设置点击事件
        musicListView.setOnItemClickListener(new OnItemClickListener() {
            // parent--父视图
            // view——当前点击的View
            // position——当前点击的位置
            // id——当前点击项的ID
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                currentPosition = position;
                play();
                play.setText("暂停");
            }
        });

        initView();

        seekbar = (SeekBar) findViewById(R.id.seekbar);

    }

    private void initView() {

        pre = (Button) findViewById(R.id.prebtn);
        next = (Button) findViewById(R.id.nextbtn);
        play = (Button) findViewById(R.id.playbtn);
        stop = (Button) findViewById(R.id.stopbtn);

        // 上一曲
        pre.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                previous();
            }
        });

        // 下一曲
        next.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                next();
            }
        });

        // 播放
        play.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()) {
                    // 如果正在播放,则暂停,并把按钮上的文字设置成“播放”
                    mediaPlayer.pause();
                    play.setText("播放");
                } else {
                    // 如果已暂停,则播放,并把按钮上的文字设置成“暂停”
                    mediaPlayer.start();
                    play.setText("暂停");
                }
            }
        });

        // 停止
        stop.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
                play.setText("播放");
                // 设置进度条归零
                seekbar.setProgress(0);
                //线程标志位,线程停止
                isStop = true;
            }
        });

    }

    /**
     * 初始化数据,获取手机中的音乐文件,并添加至list列表中
     */
    private void initData() {
        // 创建ContentResolver
        resolver = getContentResolver();
        // 创建游标
        Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,
                null, null);
        // 把光标移到第一位
        cursor.moveToFirst();
        for (int i = 0; i < cursor.getCount(); i++) {
            // 获取歌曲名字
            String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            // 获取歌手名字
            String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            // 获取歌曲的路径
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            // 新建一个MusicVO对象
            MusicVO music = new MusicVO();
            music.setName(name);
            music.setSinger(singer);
            music.setPath(path);
            musicList.add(music);
            //游标下移
            cursor.moveToNext();
        }
        // 关闭游标,释放资源
        cursor.close();
    }

    /**
     * 播放
     */
    private void play() {
        isStop = false;
        try {
            // 重置
            mediaPlayer.reset();
            // 设置音乐播放源
            mediaPlayer.setDataSource(musicList.get(currentPosition).getPath());
            // 准备
            mediaPlayer.prepare();
            // 启动
            mediaPlayer.start();
            // 设置播放结束后自动循环播放
            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    next();
                }
            });
            // 设置seekbar的最大值
            seekbar.setMax(mediaPlayer.getDuration());
            // 创建一个线程
            thread = new Thread(new SeekBarThread());
            // 启动线程
            thread.start();
        } catch (IllegalArgumentException | SecurityException | IllegalStateException
                | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 下一曲
     */
    private void next() {
        if (currentPosition == musicList.size() - 1) {
            currentPosition = 0;
        } else {
            currentPosition = currentPosition + 1;
        }
        play();
    }

    /**
     * 上一曲
     */
    private void previous() {
        if (currentPosition == 0) {
            currentPosition = musicList.size() - 1;
        } else {
            currentPosition = currentPosition - 1;
        }
        play();
    }

    // 自定义的线程
    private class SeekBarThread implements Runnable {

        @Override
        public void run() {
            while (mediaPlayer != null && isStop == false) {
                // 将SeekBar位置设置到当前播放位置
                seekbar.setProgress(mediaPlayer.getCurrentPosition());
                try {
                    // 每100毫秒更新一次位置
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}

MyAdapter

public class MusicAdapter extends BaseAdapter{

    private Context mContext;
    private List<MusicVO> mList;

    public MusicAdapter(Context context,List<MusicVO> list) {
        this.mContext = context;
        this.mList = list;
    }

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

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View v = inflater.inflate(R.layout.item, null);
        TextView nameText = (TextView) v.findViewById(R.id.name_view);
        TextView singerText = (TextView) v.findViewById(R.id.singer_view);
        nameText.setText(mList.get(position).getName());
        singerText.setText(mList.get(position).getSinger());
        return v;
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值