接着上一篇的继续,该节讲的是实现一个音乐播放的界面,毕竟直接在主界面播放音乐无法看到细节,也不够美观;这里我们在主界面右下角的音乐图标上添加点击监听,点击即可转到播放音乐界面,具体代码如下:(整个项目源码下载链接在文章末尾)
1.MainActivity做如下修改:
//音乐控制按钮的监听
private class MyPlayListener implements View.OnClickListener {
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.pre:
pre();
break;
case R.id.playandpause:
if (isPlaying) {
pause();
} else {
play();
}
break;
case R.id.next:
next();
break;
case R.id.playarea:
switchToPlayActivity();//添加转到播放界面的监听
break;
default:
break;
}
}
}
public void switchToPlayActivity() {
Log.d("MainActivity", "switchToPlayActivity");
Intent intent = new Intent(this, PlayActivity.class);
startActivity(intent);
}
//通信后台MusicService更新播放信息
public void notifyPlayService() {
//...
refreshPlayState();
notifyPlayActivity();//每次播放状态改变通知播放界面
}
2.MusicService作如下修改
//继续播放
private void continuePlaying() {
Log.d("MusicService", "continuePlaying");
musicPlayer.start();
timer.cancel();//timer定时给播放界面发送当前播放时间和进度
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (musicPlayer != null && musicPlayer.isPlaying()) {
int playedTime = musicPlayer.getCurrentPosition();
int duration = musicPlayer.getDuration();
Intent updateIntent = new Intent();
updateIntent.putExtra("playedTime", playedTime);
updateIntent.putExtra("duration", duration);
updateIntent.putExtra("progrees", playedTime/duration);
updateIntent.setAction("action.updateplayedtime");
MusicService.this.sendBroadcast(updateIntent);
}
}
}, 0, 1000);
}
//从头开始播放一首歌
private void play() {
new Thread(new Runnable() {
@Override
public void run() {
if (musicPlayer.isPlaying()) {
musicPlayer.stop();
}
try {
musicPosition = 0;
musicPlayer.reset();
musicPlayer.setDataSource(MainActivity.currentMusicUrl);
musicPlayer.prepare();
musicPlayer.start();
//播放完成发送播放下一首的广播请求
musicPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
Intent completeIntent = new Intent();
completeIntent.setAction("action.nextsong");
sendBroadcast(completeIntent);
Log.d("MusicService", "sendBroadcast");
}
});
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(MusicService.this, "加载音乐失败,请检查网络链接!",500).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
timer.cancel();//timer定时给播放界面发送当前播放时间和进度
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (musicPlayer != null && musicPlayer.isPlaying()) {
int playedTime = musicPlayer.getCurrentPosition();
int duration = musicPlayer.getDuration();
Intent updateIntent = new Intent();
updateIntent.putExtra("playedTime", playedTime);
updateIntent.putExtra("duration", duration);
updateIntent.putExtra("progrees", playedTime/duration);
updateIntent.setAction("action.updateplayedtime");
MusicService.this.sendBroadcast(updateIntent);
}
}
}, 0, 200);
}
private BroadcastReceiver updateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("action.changesong")) {
prepareMusic(intent);
} else if (action.equals("action.newProgress")) {//接收到手动拖动进度条广播后改变音乐播放进度
int newProgress = intent.getIntExtra("newProgress", 0);
int time = newProgress * musicPlayer.getDuration() / 100;
musicPlayer.seekTo(time);
}
}
};
@Override
public void onCreate() {
super.onCreate();
Log.d("MusicService", "_onCreate");
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("action.changesong");
intentFilter.addAction("action.newProgress");
registerReceiver(updateReceiver, intentFilter);
timer = new Timer();
}
3.添加PlayActivity
package com.example.comfortmusic_1;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
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.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
public class PlayActivity extends Activity {
private TextView lrc;
private TextView title;//歌曲名
private TextView artist;//演唱者
private TextView playedTime;//已播放时长
private TextView duration;//整首歌时长
private ImageView lrcPic;//专辑图标
private SeekBar seekBar;//播放进度条
private Animation lrcAnimation;//专辑图标旋转动画
//音乐控制UI
private ImageView pre;
private ImageView playOrPause;
private ImageView next;
private ImageView cycleView;
private MusicOnClickListener listener;
private boolean changeSong;
private int progress;
public static int playedMusicTime;
protected static final String TAG = "PlayActivity";
Handler handler;
public static boolean changeProgress;
public double deltaY;
public int durationMusic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play);
Toast.makeText(PlayActivity.this, "PlayActivity_onCreate", 300).show();
init();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("action.updateplayedtime");
intentFilter.addAction("action.notifyPlayActivity");
registerReceiver(updateReceiver, intentFilter);
}
private void init() {
lrc = (TextView) findViewById(R.id.lrc);
lrcPic = (ImageView) findViewById(R.id.lrcpic);
lrcAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
lrcPic.startAnimation(lrcAnimation);
listener = new MusicOnClickListener();
title = (TextView) findViewById(R.id.title1);
artist = (TextView) findViewById(R.id.artist1);
playedTime = (TextView) findViewById(R.id.playedtime);
playedTime.setText("00:00");
duration = (TextView) findViewById(R.id.duration1);
seekBar = (SeekBar) findViewById(R.id.seekBar1);
pre = (ImageView) findViewById(R.id.pre1);
playOrPause = (ImageView) findViewById(R.id.playorpause1);
// playOrPause.setImageResource(R.drawable.play);
next = (ImageView) findViewById(R.id.next1);
cycleView = (ImageView) findViewById(R.id.cycleview);
pre.setOnClickListener(listener);
cycleView.setOnClickListener(listener);
lrcPic.setOnClickListener(listener);
lrc.setOnClickListener(listener);
playOrPause.setOnClickListener(listener);
next.setOnClickListener(listener);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Log.d(TAG, "onStopTrackingTouch");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Log.d(TAG, "onStartTrackingTouch");
}
@Override
public void onProgressChanged(SeekBar seekBar, int newProgress,boolean fromUser) {//手动改变进度条时改变音乐播放进度
// Log.d(TAG, "onProgressChanged");
if (Math.abs(newProgress - progress) < 2) {
return;
}
changeProgress = true;
PlayActivity.playedMusicTime = newProgress * durationMusic/100;
seekBar.setProgress(newProgress);
Intent intent = new Intent();
intent.putExtra("newProgress", newProgress);
intent.setAction("action.newProgress");
PlayActivity.this.sendBroadcast(intent);
}
});
getData();
updatePlayingUI();
}
//初始化UI
private void getData() {
title.setText(MainActivity.currentMusicTitle);
artist.setText(MainActivity.currentMusicArtist);
duration.setText(MainActivity.currentMusicDuration);
updatePlayingUI();
}
//跟新UI状态
private void updatePlayingUI() {
if (MainActivity.isPlaying ) {
lrc.setVisibility(View.VISIBLE);
lrcPic.startAnimation(lrcAnimation);
playOrPause.setImageResource(R.drawable.pause);
} else {
lrcPic.clearAnimation();
playOrPause.setImageResource(R.drawable.play);
}
}
@Override
protected void onDestroy() {
this.unregisterReceiver(updateReceiver);
super.onDestroy();
}
private class MusicOnClickListener implements OnClickListener {
@Override
public void onClick(View source) {
Intent intent = new Intent();
switch (source.getId()) {
case R.id.pre1: //上一首
seekBar.setProgress(0);
playedTime.setText("00:00");
intent.setAction("action.pre");
sendGB(intent);
break;
case R.id.playorpause1://播放/暂停
if (MainActivity.isPlaying) {
MainActivity.isPlaying = false;
updatePlayingUI();
intent.setAction("action.pause");
sendGB(intent);
} else {
MainActivity.isPlaying = true;
updatePlayingUI();
intent.setAction("action.play");
sendGB(intent);
}
break;
case R.id.next1://下一首
seekBar.setProgress(0);
playedTime.setText("00:00");
intent.setAction("action.next");
sendGB(intent);
break;
case R.id.cycleview://改变循环模式
if (MainActivity.CYCLE == MainActivity.CYCLE_LIST) {
MainActivity.CYCLE = MainActivity.CYCLE_RANDOM;
cycleView.setImageResource(R.drawable.play_random);
Toast.makeText(PlayActivity.this, "随机循环", 300).show();
} else if (MainActivity.CYCLE == MainActivity.CYCLE_RANDOM) {
cycleView.setImageResource(R.drawable.play_repeat_one);
MainActivity.CYCLE = MainActivity.CYCLE_SINGLE;
Toast.makeText(PlayActivity.this, "单曲循环", 300).show();
} else if (MainActivity.CYCLE == MainActivity.CYCLE_SINGLE) {
cycleView.setImageResource(R.drawable.play_list);
MainActivity.CYCLE = MainActivity.CYCLE_LIST;
Toast.makeText(PlayActivity.this, "列表循环", 300).show();
updatePlayingUI();
}
break;
case R.id.lrcpic:
break;
case R.id.lrc:
Log.d(TAG, "click lrc");
break;
case R.id.lrc1:
break;
default:
break;
}
}
}
private void sendGB(Intent intent) {
// Toast.makeText(PlayActivity.this, "sendBroadcast-action:"+ intent.getAction(), 300).show();
PlayActivity.this.sendBroadcast(intent);
}
private BroadcastReceiver updateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("action.updateplayedtime")) //更新播放时间-进度条
{
progress = intent.getIntExtra("progress", 0);
playedMusicTime = intent.getIntExtra("playedTime", 0);
if (changeSong) {
playedTime.setText("00:00");
} else {
playedTime.setText(formatTime(playedMusicTime));
}
durationMusic = intent.getIntExtra("duration", 0);
progress = playedMusicTime*100/durationMusic;
seekBar.setProgress(progress);
} else if (action.equals("action.notifyPlayActivity")) {//更新播放信息
title.setText(MainActivity.currentMusicTitle);
artist.setText(MainActivity.currentMusicArtist);
duration.setText(MainActivity.currentMusicDuration);
if (MainActivity.isPlaying) {
playOrPause.setImageResource(R.drawable.pause);
} else {
playOrPause.setImageResource(R.drawable.play);
}
} else if (action.equals("action.destroy")) {
PlayActivity.this.onDestroy();
}
}
};
//转换方法,将毫秒单位的时长转换成时间格式00:00
protected String formatTime(int time) {
int allsecond = time / 1000;
String minute = allsecond / 60 + "";
if (minute.length() < 2) {minute = "0" + minute;}
String second = allsecond % 60 + "";
if (second.length() < 2) {second = "0" + second;}
return minute + ":" +second;
}
@Override
protected void onResume() {
if (MainActivity.CYCLE == MainActivity.CYCLE_LIST) {
cycleView.setImageResource(R.drawable.play_list);
//Toast.makeText(PlayActivity.this, "列表循环", 200).show();
} else if (MainActivity.CYCLE == MainActivity.CYCLE_RANDOM) {
cycleView.setImageResource(R.drawable.play_random);
//Toast.makeText(PlayActivity.this, "随机循环", 200).show();
} else if (MainActivity.CYCLE == MainActivity.CYCLE_SINGLE) {
cycleView.setImageResource(R.drawable.play_repeat_one);
//Toast.makeText(PlayActivity.this, "单曲循环", 200).show();
}
super.onResume();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
}
至此基本实现了音乐播放界面的展示,后期将继续拓展功能.
Android本地及网络音乐播放器源码下载