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

posted on 2011-12-14 20:45  吴一达  阅读(142)  评论(0编辑  收藏  举报

导航