1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android应用开发-MP3音乐播放器代码实现(三)

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

时间:2020-11-22 06:41:10

相关推荐

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

好了,下面贴一下整个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 Activity{private TextView musicTitle = null;private TextView musicArtist = null;private 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";//音乐随机播放动作@Overrideprotected 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数据*/@Overrideprotected 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;}/*** 反注册广播*/@Overrideprotected void onStop() {super.onStop();unregisterReceiver(playerReceiver);}@Overrideprotected void onDestroy() {super.onDestroy();}/*** 控件点击事件* @author wwj**/private class ViewOnclickListener implements OnClickListener {Intent intent = new Intent();@Overridepublic 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 {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {if(fromUser) {audioTrackChange(progress);//用户控制进度的改变}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic 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); //上一首MP3musicTitle.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 {@Overridepublic 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会很清楚看到这几个参数的作用。这会在下一篇博客中介绍。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。