zoukankan      html  css  js  c++  java
  • Android 第三次作业

    音乐播放器

    一、实现的功能

    • 实现播放,暂停,停止,播放上一首,下一首功能
    • 显示播放列表
    • 至少可以播放3首歌曲

    二、界面截图

    视频:

    https://coding.net/u/yangguangyoyo/p/Music/git/blob/master/2019-01-04_22_52_45_tmp_tmp.mp4

    apk运行结果:

    三、部分实现代码

    1:切分(获取歌名、歌手、播放时间)

     if (song.song.contains("-")) {
          String[] str = song.song.split("-");
          str[0]=str[0].trim();
          str[1]=str[1].trim();
          song.singer = str[0];
          song.song = str[1];
    }
    list.add(song);

    2:获取歌曲的各部分信息

    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));

    3:设置时间输出格式

    //设置当前播放进度、播放总进度的时间格式
    private String parseTime(int oldTime) {
    SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");// 时间格式
    String newTime = sdf.format(new Date(oldTime));
    return newTime;
    }

    4:切换图片(播放与暂停图片的切换)

    //切换图片(播放/暂停的图标的切换)
        public void setCut_picture(){
            if(cut_picture){
                play.setImageResource(R.drawable.play);
            }else{
                play.setImageResource(R.drawable.pause);
            }
            cut_picture = !cut_picture;
    }

    5:播放初始化歌曲

    //初始化,歌曲选择第一首歌曲
    try {
    mediaPlayer.setDataSource(list.get(0).path);//在列表中寻找poistion位置的歌曲的路径
    mediaPlayer.prepare();
    } catch (IOException e) {
    e.printStackTrace();
    }
    mSeekBar.setProgress(0);//切歌一开始设置进度为0
    mSeekBar.setMax(mediaPlayer.getDuration());//设置进度条的总长度为音乐的总时间
    Total_time.setText(parseTime(mediaPlayer.getDuration()));//获取音乐的总时间
    updateProgress();//更新进度条

    6:播放,暂停,停止,播放上一首,下一首功能

    点击按钮响应:

    stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {//重置按钮的响应
    if(mediaPlayer.isPlaying()){
    mediaPlayer.reset();//停止播放
    try {
    mediaPlayer.reset();//重置歌曲
    mediaPlayer.setDataSource(list.get(Position).path);//在列表中寻找poistion位置的歌曲的路径
    mediaPlayer.prepare();
    mediaPlayer.start();//开始播放
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    });


    
    
    @Override
    public void onClick(View view) {
    switch(view.getId()){
    case R.id.last_song://上一曲
    Cut_song(--Position);
    break;
    case R.id.play://播放/停止 包括图标的切换
    if (mediaPlayer.isPlaying()) {
    mediaPlayer.pause();//暂停
    play.setImageResource(R.drawable.play);
    cut_picture = false;
    } else {
    mediaPlayer.start();//播放
    play.setImageResource(R.drawable.pause);
    cut_picture = true;
    }
    break;
    case R.id.next_song:
    Cut_song(++Position);
    break;
    }
    }

    7:切歌

    //切歌
    private void Cut_song(int position){
    //设置切歌后显示的按钮图标为播放图标
    play.setImageResource(R.drawable.pause);
    cut_picture = true;

    //防止索引歌曲列表时超界,形成一个圈
    if (position<0){
    Position = position =list.size()-1;
    }else if (position>list.size()-1){
    Position = position=0;
    }

    if (mediaPlayer==null){
    mediaPlayer=new MediaPlayer();
    }
    try {
    mediaPlayer.reset();//重置歌曲
    mediaPlayer.setDataSource(list.get(Position).path);//在列表中寻找poistion位置的歌曲的路径
    mediaPlayer.prepare();
    mediaPlayer.start();//开始播放
    } catch (IOException e) {
    e.printStackTrace();
    }

    mSeekBar.setProgress(0);//切歌一开始设置进度为0
    mSeekBar.setMax(mediaPlayer.getDuration());//设置进度条的总长度为音乐的总时间
    Total_time.setText(parseTime(mediaPlayer.getDuration()));//获取音乐的总时间
    updateProgress();//更新进度条
    }

    8:进度条的更新

    /更新进度条代码
    private void updateProgress() {
    Message msg = Message.obtain();
    int progress = mediaPlayer.getCurrentPosition();
    msg.arg1 = progress;
    mHandler.sendMessageDelayed(msg, INTERNAL_TIME);
    }

    9:进度条的实现(手动调节的实现)

    
    
    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
    }
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }
    // 当手停止拖拽进度条时执行该方法
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    int progress = seekBar.getProgress();
    cut_picture = false;
    mediaPlayer.seekTo(progress);
    setCut_picture();
    }

    四、代码链接

    五、APK链接

  • 相关阅读:
    关于vue子组件的数据变了视图不更新的解决办法
    ES5、ES6
    Vue 项目打包上线
    Threejs的学习 1、开启Threejs
    Threejs的学习 2、点,线,面
    Mahalanobis distance
    64位计算机、应用程序和32为计算机、应用程序
    C++编译器无法捕捉到的8种错误(转载)
    最大字段和的扩展最大子矩阵和及最大m字段和问题
    最大字段和各种不同算法实现(参考编程珠玑)
  • 原文地址:https://www.cnblogs.com/dengwang/p/10105127.html
Copyright © 2011-2022 走看看