• Android多媒体分析(五)音乐播放器实例


    源码下载地址csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190

    总之说了这么多上个例子让大家看看吧!先来个简单的例子,上图:

    先说说这个程序的基本框架吧:这个程序有两个线程一个Main负责播放音乐,一个Handler负责更新数据,这个播放器是通过ContentProvider获取存在

    数据库中的相关信息,然后播放音乐。附上代码:

    这里注释挺详细的如果有什么不明白的可以看前几篇文章,里面有详细解释:

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
    
      // 初始化各种控件
      ProceseekBar2 = (SeekBar) findViewById(R.id.seekBar1);  // ProceseekBar2是调节播放进度的拖动条
      SoundseekBar = (SeekBar) findViewById(R.id.seekBar2);   // SoundseekBar是调节音量的拖动条
      button = (Button) findViewById(R.id.button1);
      nowPlayTime = (TextView) findViewById(R.id.textView1);
      allTime = (TextView) findViewById(R.id.textView2);
      volumeView = (TextView) findViewById(R.id.textView3);
      maxVolumeTextView = (TextView) findViewById(R.id.textView4);
      songNameTV = (TextView) findViewById(R.id.songName);
      songTitleTV = (TextView) findViewById(R.id.songTitle);
      
      button.setOnClickListener(new ButtonListener());
      
      // 获取歌曲的相关信息
      getSongInfo();
    
      // 显示歌曲名称和歌手
      songTitleTV.setText("歌曲名称:" + songTitle);
      songNameTV.setText("歌手:" + songName);
      
      mediaPlayer = new MediaPlayer();
      audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
      // 获取最大音量getStreamMaxVolume
      int MaxSound = audioManager
        .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      maxVolumeTextView.setText(String.valueOf(MaxSound));
      // 设置音量的最大范围
      SoundseekBar.setMax(MaxSound);
      // 获取当前音量范围getStreamVolume
      int currentSount = audioManager
        .getStreamVolume(AudioManager.STREAM_MUSIC);
      volumeView.setText(String.valueOf(currentSount));
      SoundseekBar.setProgress(currentSount);
      SoundseekBar.setOnSeekBarChangeListener(new SeekBarListener());
      ProceseekBar2.setOnSeekBarChangeListener(new ProcessBarListener());
    
     }
    
     // 从数据库读取歌曲信息,此处只做了读取数据库中第一首歌曲的信息
     private void getSongInfo() {
      // TODO Auto-generated method stub
       ContentResolver cr = getContentResolver();
             /** 此处的query是ContentResolver,不是数据库的,因此必须得到一个ContentResolver对象
             *   返回所有在外部存储卡上的音乐文件的信息
             *   第二个参数Null则返回所有信息
             */
             Cursor c = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
               MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
             
             if(c == null) {
              Toast.makeText(this, "没有歌曲信息", Toast.LENGTH_SHORT).show();
             } else {
    
              if(c.moveToFirst()) {
    
                     // 获取歌曲的ID
    //                 int id = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
    //                 int testid = c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
    //                 // 从此处可以看出歌曲信息的在队列中是从0开始的
    //                 Toast.makeText(this, "有歌曲信息" + testid, Toast.LENGTH_SHORT).show();
                     
                     // 获取歌曲名称
                     songTitle = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                     // 获取歌手名
                     songName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                     // 获取播放路径,由于获取的路径为/mnt/sdcard所以要去掉/mnt
               songPath = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)).substring(4);
                     // 获取歌曲时间长度
    //                 int_TotalTime = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
              }
             }
     }
    
     class ButtonListener implements OnClickListener {
    
      @Override
      public void onClick(View arg0) {
       // TODO Auto-generated method stub
       if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
        button.setText("播放");
       } else {
        try {
         // 获取歌曲的全部时间并显示
         int Alltime = mediaPlayer.getDuration();
         allTime.setText(ShowTime(Alltime));
         
         mediaPlayer.reset();
         mediaPlayer.setDataSource(songPath);
         mediaPlayer.prepare();
         mediaPlayer.start();
         button.setText("暂停");
         // 更新各种参数
         StrartbarUpdate();
        } catch (IllegalArgumentException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        } catch (IllegalStateException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
       }
    
      }
    
     }
    
     class ProcessBarListener implements OnSeekBarChangeListener {
    
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
       // TODO Auto-generated method stub
       if (fromUser == true) {
        // process为此时bar的值,即歌曲播放时间此时的进度
        // seekTo()将播放进度跳到bar的值
        mediaPlayer.seekTo(progress);
        // 同时更新显示时间
        nowPlayTime.setText(ShowTime(progress));
       }
    
      }
    
      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {
       // TODO Auto-generated method stub
    
      }
    
      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {
       // TODO Auto-generated method stub
    
      }
    
     }
    
     // 调节音量大小
     class SeekBarListener implements OnSeekBarChangeListener {
    
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
       // TODO Auto-generated method stub
       if (fromUser) {
        int SeekPosition = seekBar.getProgress();
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
          SeekPosition, 0);
       }
       volumeView.setText(String.valueOf(progress));
      }
    
      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {
       // TODO Auto-generated method stub
    
      }
    
      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {
       // TODO Auto-generated method stub
    
      }
    
     }
    
     // 将ms转换为分秒时间显示函数
     public String ShowTime(int time) {
      // 将ms转换为s
      time /= 1000;
      // 求分
      int minute = time / 60;
      // 求秒
      int second = time % 60;
      minute %= 60;
      return String.format("%02d:%02d", minute, second);
     }
    
     Handler handler = new Handler();
    
     public void StrartbarUpdate() {
      // 更新seekBar1
      handler.post(r);
     }
    
     Runnable r = new Runnable() {
    
      @Override
      public void run() {
       // TODO Auto-generated method stub
       // 获取歌曲的播放进度是通过MediaPlayer这个类取得的
       // 获取歌曲播放到多少ms
       int CurrentPosition = mediaPlayer.getCurrentPosition();
       // 更新播放时间显示
       nowPlayTime.setText(ShowTime(CurrentPosition));
       // 获取歌曲总时间长度
       int mMax = mediaPlayer.getDuration();
       
       // 设置bar的最大范围
       ProceseekBar2.setMax(mMax);
       ProceseekBar2.setProgress(CurrentPosition);
       // 每隔100ms更新一次
       handler.postDelayed(r, 100);
      }
     };
    
     // 退出时做出相应的处理
     @Override
     protected void onDestroy() {
      // TODO Auto-generated method stub
      handler.removeCallbacks(r);
      mediaPlayer.stop();
      mediaPlayer.release();
      super.onDestroy();
     }
    

    在文章的最后,我会附上一个csdn零积分的下载地址。这里面有详细的注释。并且里面还有一个比较复杂的播放器。先上播放器的图:

     

    csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190

  • 相关阅读:
    git版本回退问题记录
    git add的各种情况分类
    代码优化积累【持续更新】
    package.json和package-lock.json的区别
    new Date在IE下面兼容问题
    git fetch和git pull的区别
    Node.Js的热更新服务——supervisor
    springboot 指定启动环境
    java后台解决上传图片翻转90的问题,有demo,经过测试可用
    intellij IDEA 实用快捷键
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300655.html
Copyright © 2020-2023  润新知