Android应用开发 MP3音乐播放器代码实现 三

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

Android应用开发-MP3音乐播放器代码实现(三)

2013年5月29 简、美音乐播放器开发记录

这篇博客是接着上一篇博客的,点击列表会进入播放的Activity,在这个Activity会接收到从前面的Activity传来的数据,在通过这些数据来启动服务来播放音乐,整个过程很简单,需要注意的是我们要接收的数据是哪些内容,还有我们向Service要传什么样的数据,这是根据自己的开发思路和需求来决定的,等一下你们会看到小巫到底往Service传了些什么东西,然而这些数据到底起什么作用,需要慢慢去体会,因为这是需要一点一点去调试的。

好了,下面贴一下整个Activity的实现代码,主要是播放的各种状态的实现,因为这个音乐播放器并没有完全开发完,所以朋友们需要弄清楚这一点。如果对代码的实现有不清楚的,可以给小巫留言,小巫有空一定给大家解答。

PlayerActivity.java代码:

              

package com.wwj.sb.activity;import java.util.List;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.TextView;import android.widget.Toast;import com.wwj.sb.domain.AppConstant;import com.wwj.sb.domain.Mp3Info;import com.wwj.sb.utils.MediaUtil;/** * 播放音乐界面 * @author wwj * 从主界面传递过来歌曲的Id、歌曲名、歌手、歌曲路径、播放状态 */public class PlayerActivity extends Activityprivate TextView musicTitle = nullprivate TextView musicArtist = nullprivate Button previousBtn; // 上一首 private Button repeatBtn;  // 重复(单曲循环、全部循环) private Button playBtn;   // 播放(播放、暂停) private Button shuffleBtn; // 随机播放 private Button nextBtn;  // 下一首 private Button searchBtn; //查找歌曲 private Button queueBtn; //歌曲列表 private SeekBar music_progressBar;  //歌曲进度 private TextView currentProgress; //当前进度消耗的时间 private TextView finalProgress;  //歌曲时间   private String title;  //歌曲标题 private String artist;  //歌曲艺术家 private String url;   //歌曲路径 private int listPosition; //播放歌曲在mp3Infos的位置 private int currentTime; //当前歌曲播放时间 private int duration;  //歌曲长度 private int flag;   //播放标识  private int repeatState; private final int isCurrentRepeat = 1; // 单曲循环 private final int isAllRepeat = 2;   // 全部循环 private final int isNoneRepeat = 3;  // 无重复播放 private boolean isPlaying;     // 正在播放 private boolean isPause;     // 暂停 private boolean isNoneShuffle;    // 顺序播放 private boolean isShuffle;    // 随机播放  private List<Mp3Info> mp3Infos;   private PlayerReceiver playerReceiver;  public static final String UPDATE_ACTION = "com.wwj.action.UPDATE_ACTION"//更新动作 public static final String CTL_ACTION = "com.wwj.action.CTL_ACTION";  //控制动作 public static final String MUSIC_CURRENT = "com.wwj.action.MUSIC_CURRENT"//音乐当前时间改变动作 public static final String MUSIC_DURATION = "com.wwj.action.MUSIC_DURATION";//音乐播放长度改变动作 public static final String MUSIC_PLAYING = "com.wwj.action.MUSIC_PLAYING"//音乐正在播放动作 public static final String REPEAT_ACTION = "com.wwj.action.REPEAT_ACTION"//音乐重复播放动作 public static final String SHUFFLE_ACTION = "com.wwj.action.SHUFFLE_ACTION";//音乐随机播放动作  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.play_activity_layout);  musicTitle = (TextView) findViewById(R.id.musicTitle);  musicArtist = (TextView) findViewById(R.id.musicArtist);    findViewById();  setViewOnclickListener();  mp3Infos = MediaUtil.getMp3Infos(PlayerActivity.this);  playerReceiver = new PlayerReceiver();  IntentFilter filter = new IntentFilter();  filter.addAction(UPDATE_ACTION);  filter.addAction(MUSIC_CURRENT);  filter.addAction(MUSIC_DURATION);  registerReceiver(playerReceiver, filter);   }  /**  * 从界面上根据id获取按钮  */ private void findViewById() {  previousBtn = (Button) findViewById(R.id.previous_music);  repeatBtn = (Button) findViewById(R.id.repeat_music);  playBtn = (Button) findViewById(R.id.play_music);  shuffleBtn = (Button) findViewById(R.id.shuffle_music);  nextBtn = (Button) findViewById(R.id.next_music);  searchBtn = (Button) findViewById(R.id.search_music);  queueBtn = (Button) findViewById(R.id.play_queue);  music_progressBar = (SeekBar) findViewById(R.id.audioTrack);  currentProgress = (TextView) findViewById(R.id.current_progress);  finalProgress = (TextView) findViewById(R.id.final_progress); }   /**  * 给每一个按钮设置监听器  */ private void setViewOnclickListener() {  ViewOnclickListener ViewOnClickListener = new ViewOnclickListener();  previousBtn.setOnClickListener(ViewOnClickListener);  repeatBtn.setOnClickListener(ViewOnClickListener);  playBtn.setOnClickListener(ViewOnClickListener);  shuffleBtn.setOnClickListener(ViewOnClickListener);  nextBtn.setOnClickListener(ViewOnClickListener);  searchBtn.setOnClickListener(ViewOnClickListener);  queueBtn.setOnClickListener(ViewOnClickListener);  music_progressBar.setOnSeekBarChangeListener(new SeekBarChangeListener()); }  /**  * 在OnResume中初始化和接收Activity数据  */ @Override protected void onResume() {  super.onResume();  Intent intent = getIntent();  Bundle bundle = intent.getExtras();  title = bundle.getString("title");  artist = bundle.getString("artist");  url = bundle.getString("url");  listPosition = bundle.getInt("listPosition");  repeatState = bundle.getInt("repeatState");  isShuffle = bundle.getBoolean("shuffleState");  flag = bundle.getInt("MSG");  currentTime = bundle.getInt("currentTime");  duration = bundle.getInt("duration");  initView(); }  /**  * 初始化界面  */ public void initView() {  musicTitle.setText(title);  musicArtist.setText(artist);  music_progressBar.setProgress(currentTime);  music_progressBar.setMax(duration);  switch (repeatState) {  case isCurrentRepeat: // 单曲循环   shuffleBtn.setClickable(false);   repeatBtn.setBackgroundResource(R.drawable.repeat_current_selector);   break;  case isAllRepeat: // 全部循环   shuffleBtn.setClickable(false);   repeatBtn.setBackgroundResource(R.drawable.repeat_all_selector);   break;  case isNoneRepeat: // 无重复   shuffleBtn.setClickable(true);   repeatBtn.setBackgroundResource(R.drawable.repeat_none_selector);   break;  }  if(isShuffle) {   isNoneShuffle = false;   shuffleBtn.setBackgroundResource(R.drawable.shuffle_selector);   repeatBtn.setClickable(false);  } else {   isNoneShuffle = true;   shuffleBtn.setBackgroundResource(R.drawable.shuffle_none_selector);   repeatBtn.setClickable(true);  }  if(flag == AppConstant.PlayerMsg.PLAYING_MSG) { //如果播放信息是正在播放   Toast.makeText(PlayerActivity.this, "正在播放--" + title, 1).show();  }  else if(flag == AppConstant.PlayerMsg.PLAY_MSG) { //如果是点击列表播放歌曲的话   play();  }  playBtn.setBackgroundResource(R.drawable.play_selector);  isPlaying = true;  isPause = false; } /**  * 反注册广播  */ @Override protected void onStop() {  super.onStop();  unregisterReceiver(playerReceiver); }  @Override protected void onDestroy() {  super.onDestroy(); } /**  * 控件点击事件  * @author wwj  *  */ private class ViewOnclickListener implements OnClickListener {  Intent intent = new Intent();  @Override  public void onClick(View v) {   switch(v.getId()) {   case R.id.play_music:    if (isPlaying) {     playBtn.setBackgroundResource(R.drawable.pause_selector);     intent.setAction("com.wwj.media.MUSIC_SERVICE");     intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);     startService(intent);     isPlaying = false;     isPause = true;         } else if (isPause) {     playBtn.setBackgroundResource(R.drawable.play_selector);     intent.setAction("com.wwj.media.MUSIC_SERVICE");     intent.putExtra("MSG", AppConstant.PlayerMsg.CONTINUE_MSG);     startService(intent);     isPause = false;     isPlaying = true;    }    break;   case R.id.previous_music:  //上一首歌曲    previous_music();    break;   case R.id.next_music:   //下一首歌曲    next_music();    break;   case R.id.repeat_music:   //重复播放音乐    if (repeatState == isNoneRepeat) {     repeat_one();     shuffleBtn.setClickable(false); //是随机播放变为不可点击状态     repeatState = isCurrentRepeat;     } else if (repeatState == isCurrentRepeat) {     repeat_all();     shuffleBtn.setClickable(false);     repeatState = isAllRepeat;    } else if (repeatState == isAllRepeat) {     repeat_none();     shuffleBtn.setClickable(true);     repeatState = isNoneRepeat;    }    Intent intent = new Intent(REPEAT_ACTION);    switch (repeatState) {    case isCurrentRepeat: // 单曲循环     repeatBtn       .setBackgroundResource(R.drawable.repeat_current_selector);     Toast.makeText(PlayerActivity.this, R.string.repeat_current,       Toast.LENGTH_SHORT).show();               intent.putExtra("repeatState", isCurrentRepeat);     sendBroadcast(intent);     break;    case isAllRepeat: // 全部循环     repeatBtn       .setBackgroundResource(R.drawable.repeat_all_selector);     Toast.makeText(PlayerActivity.this, R.string.repeat_all,       Toast.LENGTH_SHORT).show();     intent.putExtra("repeatState", isAllRepeat);     sendBroadcast(intent);     break;    case isNoneRepeat: // 无重复     repeatBtn       .setBackgroundResource(R.drawable.repeat_none_selector);     Toast.makeText(PlayerActivity.this, R.string.repeat_none,       Toast.LENGTH_SHORT).show();     intent.putExtra("repeatState", isNoneRepeat);     break;    }    break;   case R.id.shuffle_music:   //随机播放状态    Intent shuffleIntent = new Intent(SHUFFLE_ACTION);    if (isNoneShuffle) {   //如果当前状态为非随机播放,点击按钮之后改变状态为随机播放     shuffleBtn       .setBackgroundResource(R.drawable.shuffle_selector);     Toast.makeText(PlayerActivity.this, R.string.shuffle,       Toast.LENGTH_SHORT).show();     isNoneShuffle = false;     isShuffle = true;     shuffleMusic();     repeatBtn.setClickable(false);     shuffleIntent.putExtra("shuffleState", true);     sendBroadcast(shuffleIntent);    } else if (isShuffle) {     shuffleBtn       .setBackgroundResource(R.drawable.shuffle_none_selector);     Toast.makeText(PlayerActivity.this, R.string.shuffle_none,       Toast.LENGTH_SHORT).show();     isShuffle = false;     isNoneShuffle = true;     repeatBtn.setClickable(true);     shuffleIntent.putExtra("shuffleState", false);     sendBroadcast(shuffleIntent);    }    break;   }  } }  /**  * 实现监听Seekbar的类  * @author wwj  *  */ private class SeekBarChangeListener implements OnSeekBarChangeListener {  @Override  public void onProgressChanged(SeekBar seekBar, int progress,    boolean fromUser) {   if(fromUser) {    audioTrackChange(progress); //用户控制进度的改变   }  }  @Override  public void onStartTrackingTouch(SeekBar seekBar) {     }  @Override  public void onStopTrackingTouch(SeekBar seekBar) {     }   }  /**  * 播放音乐  */ public void play() {  //开始播放的时候为顺序播放  repeat_none();  Intent intent = new Intent();  intent.setAction("com.wwj.media.MUSIC_SERVICE");  intent.putExtra("url", url);  intent.putExtra("listPosition", listPosition);  intent.putExtra("MSG", flag);  startService(intent); } /**  * 随机播放  */ public void shuffleMusic() {  Intent intent = new Intent(CTL_ACTION);  intent.putExtra("control", 4);  sendBroadcast(intent); } public void audioTrackChange(int progress) {  Intent intent = new Intent();  intent.setAction("com.wwj.media.MUSIC_SERVICE");  intent.putExtra("url", url);  intent.putExtra("listPosition", listPosition);  if(isPause) {   intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);  }  else {   intent.putExtra("MSG", AppConstant.PlayerMsg.PROGRESS_CHANGE);  }  intent.putExtra("progress", progress);  startService(intent); } /**  * 单曲循环  */ public void repeat_one() {  Intent intent = new Intent(CTL_ACTION);  intent.putExtra("control", 1);  sendBroadcast(intent); }  /**  * 全部循环  */ public void repeat_all() {  Intent intent = new Intent(CTL_ACTION);  intent.putExtra("control", 2);  sendBroadcast(intent); } /**  * 顺序播放  */ public void repeat_none() {  Intent intent = new Intent(CTL_ACTION);  intent.putExtra("control", 3);  sendBroadcast(intent); } /**  * 上一首  */ public void previous_music() {  playBtn.setBackgroundResource(R.drawable.play_selector);  listPosition = listPosition - 1;  if(listPosition >= 0) {   Mp3Info mp3Info = mp3Infos.get(listPosition);  //上一首MP3   musicTitle.setText(mp3Info.getTitle());   musicArtist.setText(mp3Info.getArtist());   url = mp3Info.getUrl();   Intent intent = new Intent();   intent.setAction("com.wwj.media.MUSIC_SERVICE");   intent.putExtra("url", mp3Info.getUrl());   intent.putExtra("listPosition", listPosition);   intent.putExtra("MSG", AppConstant.PlayerMsg.PRIVIOUS_MSG);   startService(intent);  }  else {   Toast.makeText(PlayerActivity.this, "没有上一首了", Toast.LENGTH_SHORT).show();  } }  /**  * 下一首  */ public void next_music() {  playBtn.setBackgroundResource(R.drawable.play_selector);  listPosition = listPosition + 1;  if(listPosition <= mp3Infos.size() - 1) {   Mp3Info mp3Info = mp3Infos.get(listPosition);   url = mp3Info.getUrl();   musicTitle.setText(mp3Info.getTitle());   musicArtist.setText(mp3Info.getArtist());   Intent intent = new Intent();   intent.setAction("com.wwj.media.MUSIC_SERVICE");   intent.putExtra("url", mp3Info.getUrl());   intent.putExtra("listPosition", listPosition);   intent.putExtra("MSG", AppConstant.PlayerMsg.NEXT_MSG);   startService(intent);  } else {   Toast.makeText(PlayerActivity.this, "没有下一首了", Toast.LENGTH_SHORT).show();  } }   /**  * 用来接收从service传回来的广播的内部类  * @author wwj  *  */ public class PlayerReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {   String action = intent.getAction();   if(action.equals(MUSIC_CURRENT)) {    currentTime = intent.getIntExtra("currentTime", -1);    currentProgress.setText(MediaUtil.formatTime(currentTime));    music_progressBar.setProgress(currentTime);   } else if(action.equals(MUSIC_DURATION)) {    int duration = intent.getIntExtra("duration", -1);    music_progressBar.setMax(duration);    finalProgress.setText(MediaUtil.formatTime(duration));   } else if(action.equals(UPDATE_ACTION)) {    //获取Intent中的current消息,current代表当前正在播放的歌曲    listPosition = intent.getIntExtra("current", -1);    url = mp3Infos.get(listPosition).getUrl();    if(listPosition >= 0) {     musicTitle.setText(mp3Infos.get(listPosition).getTitle());     musicArtist.setText(mp3Infos.get(listPosition).getArtist());    }    if(listPosition == 0) {     finalProgress.setText(MediaUtil.formatTime(mp3Infos.get(listPosition).getDuration()));     playBtn.setBackgroundResource(R.drawable.pause_selector);     isPause = true;    }   }  }   } }

以上代码主要有以下几点实现:

1. 播放状态(上一首、下一首、暂停音乐、播放音乐、重复播放、随机播放)

2. 进度更新(自定义Seekbar,Seekbar触发时间控制音乐播放的位置)

3. 接收来自Service的广播,对播放时间,歌曲信息的UI更新。


要注意的地方:

1. 在onResume里接收来自HomeActivity里通过Intent传过来的数据,它是保存在bundle当中的,所以可以通过Bundle来取数据。

2. 通过startSercice来启动服务,在启动之前我们往服务传的数据

/**  * 播放音乐  */ public void play() {  //开始播放的时候为顺序播放  repeat_none();  Intent intent = new Intent();  intent.setAction("com.wwj.media.MUSIC_SERVICE");  intent.putExtra("url", url);  intent.putExtra("listPosition", listPosition);  intent.putExtra("MSG", flag);  startService(intent); }

可以看到只有url(音乐播放路径)、listPosition(列表的点击位置,也就是mp3Infos的位置)、MSG(代表播放信息)。这几个是来控制播放的,在Service会很清楚看到这几个参数的作用。这会在下一篇博客中介绍。


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/gfjggtf/article/details/83827859