Android应用--简、美音乐播放器原型放送

2013年7月5日简、美音乐播放器开发

前言:小巫的简、美音乐播放器从5月7号开始开发,之前以为时间很充足,也没有估量整个软件的需求,如果简单实现基本的操作的话,确实可以在一个星期内把一个简单的音乐播放器给开发出来。不过我增加了很多特性,比如歌词的显示,专辑封面的显示,界面的左右切换,倒影效果实现等,让整个音乐播放器添色很多,与我之前想开发出操作简单,界面漂亮的想法一致,这是另我比较开心的。到目前为止实现了以下功能:
第1阶段完成的功能:

1.   自动显示音乐列表
2.   点击列表播放音乐
3.   长按列表弹出对话框
4.   暂停音乐
5.   上一首音乐
6.   下一首音乐
7.   自动播放下一首歌曲
8.   单曲循环
9.   全部循环
10.  随机播放

第2阶段已完成的功能:
1. 歌词显示(实现歌词滚动功能)
2. 来电监听 
3. 控制音量
4. 获取专辑图片

5. 界面美化--实现专辑倒影
6. 实现左右界面切换

7. 实现对话框里列表(播放音乐、设为铃声、查看信息)项点击功能

第2阶段还未实现的功能

8. 实现有趣功能--甩歌

9. 在线下载歌词
10. 在线搜索音乐
11. 在线下载音乐

12.实现在通知栏显示播放状态
13.实现音乐播放的桌面小控件

这篇博客要介绍的内容是第2阶段的第7个功能实现,完成这个功能之后,基本上这个播放器已经是功能完备的原型了。我知道你们已经等不及想要源码了,我就满足大家一上来就要源码的愿望,下面是我的资源链接,我可能也会把它开源到gitHub里,不过要等我弄清楚,怎么把它弄上gitHub.

http://download.csdn.net/detail/wwj_748/6325681

好啦,来看看整个软件的全貌吧:
  
  
  
       
             
以上就是简、美音乐播放器的全貌,是不是感觉蛮简美的哈。
下面是实现第二阶段功能的代码:
算了,我直接把整个Activity的代码贴出来,里面的代码也有做相应的修改的。不过你们直接看源码就好了。
/SimpleBeautyMusicPlayer/src/com/wwj/sb/activity/HomeActivity.java
package com.wwj.sb.activity;import java.io.File;
import java.util.List;import android.app.Activity;
import android.app.AlertDialog;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Vibrator;
import android.provider.MediaStore;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;import com.wwj.sb.adapter.MusicListAdapter;
import com.wwj.sb.domain.AppConstant;
import com.wwj.sb.domain.Contsant;
import com.wwj.sb.domain.Mp3Info;
import com.wwj.sb.service.PlayerService;
import com.wwj.sb.utils.ConstantUtil;
import com.wwj.sb.utils.CustomDialog;
import com.wwj.sb.utils.MediaUtil;/*** 2013/5/7* 简、美音乐播放器* @author wwj* */
public class HomeActivity extends Activity {private ListView mMusiclist; // 音乐列表private List<Mp3Info> mp3Infos = null;
//  private SimpleAdapter mAdapter; // 简单适配器MusicListAdapter listAdapter;   //改为自定义列表适配器private Button previousBtn; // 上一首private Button repeatBtn; // 重复(单曲循环、全部循环)private Button playBtn; // 播放(播放、暂停)private Button shuffleBtn; // 随机播放private Button nextBtn; // 下一首private TextView musicTitle;//歌曲标题private TextView musicDuration;   //歌曲时间private Button musicPlaying;  //歌曲专辑private ImageView musicAlbum; //专辑封面private int repeatState;      //循环标识private final int isCurrentRepeat = 1; // 单曲循环private final int isAllRepeat = 2; // 全部循环private final int isNoneRepeat = 3; // 无重复播放private boolean isFirstTime = true; private boolean isPlaying; // 正在播放private boolean isPause; // 暂停private boolean isNoneShuffle = true; // 顺序播放private boolean isShuffle = false; // 随机播放private int listPosition = 0;   //标识列表位置private HomeReceiver homeReceiver;  //自定义的广播接收器//一系列动作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 REPEAT_ACTION = "com.wwj.action.REPEAT_ACTION";     //音乐重复改变动作public static final String SHUFFLE_ACTION = "com.wwj.action.SHUFFLE_ACTION";   //音乐随机播放动作private int currentTime;  //当前时间private int duration;     //时长@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.home_activity_layout);mMusiclist = (ListView) findViewById(R.id.music_list);mMusiclist.setOnItemClickListener(new MusicListItemClickListener());mMusiclist.setOnCreateContextMenuListener(new MusicListItemContextMenuListener());mp3Infos = MediaUtil.getMp3Infos(HomeActivity.this);  //获取歌曲对象集合
//      setListAdpter(MediaUtil.getMusicMaps(mp3Infos));    //显示歌曲列表listAdapter = new MusicListAdapter(this,mp3Infos);mMusiclist.setAdapter(listAdapter);findViewById();               //找到界面上的每一个控件setViewOnclickListener();  //为一些控件设置监听器repeatState = isNoneRepeat; // 初始状态为无重复播放状态homeReceiver = new HomeReceiver();// 创建IntentFilterIntentFilter filter = new IntentFilter();// 指定BroadcastReceiver监听的Actionfilter.addAction(UPDATE_ACTION);filter.addAction(MUSIC_CURRENT);filter.addAction(MUSIC_DURATION);filter.addAction(REPEAT_ACTION);filter.addAction(SHUFFLE_ACTION);// 注册BroadcastReceiverregisterReceiver(homeReceiver, 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);musicTitle = (TextView) findViewById(R.id.music_title);musicDuration = (TextView) findViewById(R.id.music_duration);musicPlaying = (Button) findViewById(R.id.playing);musicAlbum = (ImageView) findViewById(R.id.music_album);}/*** 给每一个按钮设置监听器*/private void setViewOnclickListener() {ViewOnClickListener viewOnClickListener = new ViewOnClickListener();previousBtn.setOnClickListener(viewOnClickListener);repeatBtn.setOnClickListener(viewOnClickListener);playBtn.setOnClickListener(viewOnClickListener);shuffleBtn.setOnClickListener(viewOnClickListener);nextBtn.setOnClickListener(viewOnClickListener);musicPlaying.setOnClickListener(viewOnClickListener);}/*** 控件的监听器* @author Administrator**/private class ViewOnClickListener implements OnClickListener {Intent intent = new Intent();@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.previous_music: // 上一首playBtn.setBackgroundResource(R.drawable.play_selector);isFirstTime = false;isPlaying = true;isPause = false;previous();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;}switch (repeatState) {case isCurrentRepeat: // 单曲循环repeatBtn.setBackgroundResource(R.drawable.repeat_current_selector);Toast.makeText(HomeActivity.this, R.string.repeat_current,Toast.LENGTH_SHORT).show();break;case isAllRepeat: // 全部循环repeatBtn.setBackgroundResource(R.drawable.repeat_all_selector);Toast.makeText(HomeActivity.this, R.string.repeat_all,Toast.LENGTH_SHORT).show();break;case isNoneRepeat: // 无重复repeatBtn.setBackgroundResource(R.drawable.repeat_none_selector);Toast.makeText(HomeActivity.this, R.string.repeat_none,Toast.LENGTH_SHORT).show();break;}break;case R.id.play_music: // 播放音乐if(isFirstTime) {play();isFirstTime = false;isPlaying = true;isPause = false;} else {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.shuffle_music: // 随机播放if (isNoneShuffle) {shuffleBtn.setBackgroundResource(R.drawable.shuffle_selector);Toast.makeText(HomeActivity.this, R.string.shuffle,Toast.LENGTH_SHORT).show();isNoneShuffle = false;isShuffle = true;shuffleMusic();repeatBtn.setClickable(false);} else if (isShuffle) {shuffleBtn.setBackgroundResource(R.drawable.shuffle_none_selector);Toast.makeText(HomeActivity.this, R.string.shuffle_none,Toast.LENGTH_SHORT).show();isShuffle = false;isNoneShuffle = true;repeatBtn.setClickable(true);}break;case R.id.next_music: // 下一首playBtn.setBackgroundResource(R.drawable.play_selector);isFirstTime = false;isPlaying = true;isPause = false;next();break;case R.id.playing:  //正在播放Mp3Info mp3Info = mp3Infos.get(listPosition);Intent intent = new Intent(HomeActivity.this, PlayerActivity.class);intent.putExtra("title", mp3Info.getTitle());    intent.putExtra("url", mp3Info.getUrl());intent.putExtra("artist", mp3Info.getArtist());intent.putExtra("listPosition", listPosition);intent.putExtra("currentTime", currentTime);intent.putExtra("duration", duration);intent.putExtra("MSG", AppConstant.PlayerMsg.PLAYING_MSG);startActivity(intent);break;}}}/*** 列表点击监听器* @author wwj**/private class MusicListItemClickListener implements OnItemClickListener {/*** 点击列表播放音乐*/@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {listPosition = position;    //获取列表点击的位置playMusic(listPosition); //播放音乐  }}/*** 上下文菜单显示监听器* @author Administrator**/public class MusicListItemContextMenuListener implements OnCreateContextMenuListener {@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);vibrator.vibrate(50);        //长按振动musicListItemDialog();        //长按后弹出的对话框final AdapterView.AdapterContextMenuInfo menuInfo2 = (AdapterView.AdapterContextMenuInfo) menuInfo;listPosition = menuInfo2.position;  //点击列表的位置}}/*** 填充列表* * @param mp3Infos*/
//  public void setListAdpter(List<HashMap<String, String>> mp3list) {
//      mAdapter = new SimpleAdapter(this, mp3list,
//              R.layout.music_list_item_layout, new String[] {"title",
//                      "Artist", "duration" }, new int[] {R.id.music_title,
//                      R.id.music_Artist, R.id.music_duration });mMusiclist.setAdapter(mAdapter);
//
//  }/*** 下一首歌曲*/public void next() {listPosition = listPosition + 1;if(listPosition <= mp3Infos.size() - 1) {Mp3Info mp3Info = mp3Infos.get(listPosition);musicTitle.setText(mp3Info.getTitle());Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("listPosition", listPosition);intent.putExtra("url", mp3Info.getUrl());intent.putExtra("MSG", AppConstant.PlayerMsg.NEXT_MSG);startService(intent);} else {listPosition = mp3Infos.size() - 1;Toast.makeText(HomeActivity.this, "没有下一首了", Toast.LENGTH_SHORT).show();}}/*** 上一首歌曲*/public void previous() {listPosition = listPosition - 1;if(listPosition >= 0) {Mp3Info mp3Info = mp3Infos.get(listPosition);musicTitle.setText(mp3Info.getTitle());Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("listPosition", listPosition);intent.putExtra("url", mp3Info.getUrl());intent.putExtra("MSG", AppConstant.PlayerMsg.PRIVIOUS_MSG);startService(intent);}else {listPosition = 0;Toast.makeText(HomeActivity.this, "没有上一首了", Toast.LENGTH_SHORT).show();}}/*** 播放音乐*/public void play() {playBtn.setBackgroundResource(R.drawable.play_selector);Mp3Info mp3Info = mp3Infos.get(listPosition);musicTitle.setText(mp3Info.getTitle());Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("listPosition", 0);intent.putExtra("url", mp3Info.getUrl());intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);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 shuffleMusic() {Intent intent = new Intent(CTL_ACTION);intent.putExtra("control", 4);sendBroadcast(intent);}/*** 自定义对话框*/public void musicListItemDialog() {String[] menuItems = new String[]{"播放音乐","设为铃声","查看详情"};ListView menuList = new ListView(HomeActivity.this);menuList.setCacheColorHint(Color.TRANSPARENT);menuList.setDividerHeight(1);menuList.setAdapter(new ArrayAdapter<String>(HomeActivity.this, R.layout.context_dialog_layout, R.id.dialogText, menuItems));menuList.setLayoutParams(new LayoutParams(ConstantUtil.getScreen(HomeActivity.this)[0] / 2, LayoutParams.WRAP_CONTENT));final CustomDialog customDialog = new CustomDialog.Builder(HomeActivity.this).setTitle(R.string.operation).setView(menuList).create();customDialog.show();menuList.setOnItemClickListener( new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {customDialog.cancel();customDialog.dismiss();if(position == 0){playMusic(listPosition);} else if(position == 1) {setRing();} else if(position == 2) {showMusicInfo(listPosition);}}});}/*** 显示音乐详细信息* @param position*/private void showMusicInfo(int position) {Mp3Info mp3Info = mp3Infos.get(position);LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);View view = inflater.inflate(R.layout.music_info_layout, null);((TextView) view.findViewById(R.id.tv_song_title)).setText(mp3Info.getTitle());((TextView) view.findViewById(R.id.tv_song_artist)).setText(mp3Info.getArtist());((TextView) view.findViewById(R.id.tv_song_album)).setText(mp3Info.getAlbum());((TextView) view.findViewById(R.id.tv_song_filepath)).setText(mp3Info.getUrl());((TextView) view.findViewById(R.id.tv_song_duration)).setText(MediaUtil.formatTime(mp3Info.getDuration()));((TextView) view.findViewById(R.id.tv_song_format)).setText(Contsant.getSuffix(mp3Info.getDisplayName()));((TextView) view.findViewById(R.id.tv_song_size)).setText(Contsant.formatByteToMB(mp3Info.getSize()) + "MB");new CustomDialog.Builder(HomeActivity.this).setTitle("歌曲详细信息:").setNeutralButton("确定", null).setView(view).create().show();}/*** 设置铃声*/protected void setRing() {RadioGroup rg_ring = new RadioGroup(HomeActivity.this);LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);rg_ring.setLayoutParams(params);//第一个单选按钮,来电铃声final RadioButton rbtn_ringtones = new RadioButton(HomeActivity.this);rbtn_ringtones.setText("来电铃声");rg_ring.addView(rbtn_ringtones, params);//第二个单选按钮,闹铃铃声final RadioButton rbtn_alarms = new RadioButton(HomeActivity.this);rbtn_alarms.setText("闹铃铃声");rg_ring.addView(rbtn_alarms, params);//第三个单选按钮,通知铃声final RadioButton rbtn_notifications = new RadioButton(HomeActivity.this);rbtn_notifications.setText("通知铃声");rg_ring.addView(rbtn_notifications, params);new CustomDialog.Builder(HomeActivity.this).setTitle("设置铃声").setView(rg_ring).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.cancel();dialog.dismiss();if(rbtn_ringtones.isChecked()) {try {//设置来电铃声setRingtone(listPosition);} catch (Exception e) {e.printStackTrace();}} else if(rbtn_alarms.isChecked()) {try {//设置闹铃setAlarm(listPosition);} catch (Exception e) {e.printStackTrace();}} else if(rbtn_notifications.isChecked()) {try {//设置通知铃声setNotifaction(listPosition);} catch (Exception e) {e.printStackTrace();}}}}).setNegativeButton("取消", null).show();}/*** 设置提示音* @param position*/protected void setNotifaction(int position) {Mp3Info mp3Info = mp3Infos.get(position);File sdfile = new File(mp3Info.getUrl().substring(4));ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, sdfile.getName());values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");  values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_MUSIC, false); Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath());Uri newUri = this.getContentResolver().insert(uri, values);RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, newUri);Toast.makeText( getApplicationContext(),"设置通知铃声成功!", Toast.LENGTH_SHORT ).show();}/*** 设置闹铃* @param position*/protected void setAlarm(int position) {Mp3Info mp3Info = mp3Infos.get(position);File sdfile = new File(mp3Info.getUrl().substring(4));ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, sdfile.getName());values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");  values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_MUSIC, false); Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath());Uri newUri = this.getContentResolver().insert(uri, values);RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM, newUri);Toast.makeText( getApplicationContext(),"设置闹钟铃声成功!", Toast.LENGTH_SHORT ).show();}/*** 设置来电铃声* @param position*/protected void setRingtone(int position) {Mp3Info mp3Info = mp3Infos.get(position);File sdfile = new File(mp3Info.getUrl().substring(4));ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, sdfile.getName());values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");  values.put(MediaStore.Audio.Media.IS_RINGTONE, false); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_ALARM, true); values.put(MediaStore.Audio.Media.IS_MUSIC, false); Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath());Uri newUri = this.getContentResolver().insert(uri, values);RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri);Toast.makeText( getApplicationContext(),"设置来电铃声成功!", Toast.LENGTH_SHORT ).show();}/*** 此方法通过传递列表点击位置来获取mp3Info对象* * @param listPosition*/public void playMusic(int listPosition) {if (mp3Infos != null) {Mp3Info mp3Info = mp3Infos.get(listPosition);  musicTitle.setText(mp3Info.getTitle()); //这里显示标题Bitmap bitmap = MediaUtil.getArtwork(this, mp3Info.getId(), mp3Info.getAlbumId(), true, true);//获取专辑位图对象,为小图musicAlbum.setImageBitmap(bitmap);  //这里显示专辑图片Intent intent = new Intent(HomeActivity.this, PlayerActivity.class); //定义Intent对象,跳转到PlayerActivity//添加一系列要传递的数据intent.putExtra("title", mp3Info.getTitle());   intent.putExtra("url", mp3Info.getUrl());intent.putExtra("artist", mp3Info.getArtist());intent.putExtra("listPosition", listPosition);intent.putExtra("currentTime", currentTime);intent.putExtra("repeatState", repeatState);intent.putExtra("shuffleState", isShuffle);intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);startActivity(intent);}}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();}/*** 按返回键弹出对话框确定退出*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK&& event.getAction() == KeyEvent.ACTION_DOWN) {new AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher).setTitle("退出").setMessage("您确定要退出?").setNegativeButton("取消", null).setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {finish();Intent intent = new Intent(HomeActivity.this,PlayerService.class);unregisterReceiver(homeReceiver);stopService(intent); // 停止后台服务}}).show();}return super.onKeyDown(keyCode, event);}//自定义的BroadcastReceiver,负责监听从Service传回来的广播public class HomeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction(); if(action.equals(MUSIC_CURRENT)){//currentTime代表当前播放的时间currentTime = intent.getIntExtra("currentTime", -1);musicDuration.setText(MediaUtil.formatTime(currentTime));} else if (action.equals(MUSIC_DURATION)) {duration = intent.getIntExtra("duration", -1);}else if(action.equals(UPDATE_ACTION)) {//获取Intent中的current消息,current代表当前正在播放的歌曲listPosition = intent.getIntExtra("current", -1);if(listPosition >= 0) {musicTitle.setText(mp3Infos.get(listPosition).getTitle());}}else if(action.equals(REPEAT_ACTION)) {repeatState = intent.getIntExtra("repeatState", -1);switch (repeatState) {case isCurrentRepeat: // 单曲循环repeatBtn.setBackgroundResource(R.drawable.repeat_current_selector);shuffleBtn.setClickable(false);break;case isAllRepeat: // 全部循环repeatBtn.setBackgroundResource(R.drawable.repeat_all_selector);shuffleBtn.setClickable(false);break;case isNoneRepeat: // 无重复repeatBtn.setBackgroundResource(R.drawable.repeat_none_selector);shuffleBtn.setClickable(true);break;}}else if(action.equals(SHUFFLE_ACTION)) {isShuffle = intent.getBooleanExtra("shuffleState", false);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);}}}}
}
2016年补充:这个例子是笔者初学时做的一个Demo,还不是很完善,基于sdk也是比较旧,是基于Android 2.3版本的,现在Android已经更新迭代很多版本的了,无论是代码和sdk都已经不适用,大家学习这个demo的时候,了解开发的思路就行了,网上有很多优秀的开源播放器学习,音乐播放器作为入门练手的项目还是很不错的,这个系列的博文已经很久没更新,有很多错漏的地方,望大家见谅。

Android应用--简、美音乐播放器原型放送(作者:小巫)相关推荐

  1. Android应用--简 美音乐播放器原型放送(作者 小巫)

    Android应用--简.美音乐播放器原型放送 2013年7月5日简.美音乐播放器开发 前言:小巫的简.美音乐播放器从5月7号开始开发,之前以为时间很充足,也没有估量整个软件的需求,如果简单实现基本的 ...

  2. Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)

    Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...

  3. Android应用--简、美音乐播放器增加音量控制

    Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...

  4. Android应用--简、美音乐播放器实现专辑倒影效果

    Android应用--简.美音乐播放器实现专辑倒影效果 2013年7月4日 简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词与专辑界面 5 ...

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

    2013年5月25日 简.美音乐播放器开发 小巫在这里罗列这个播放器已经实现的功能: 1.   自动显示音乐列表 2.   点击列表播放音乐 3.   长按列表弹出对话框 4.   暂停音乐 5.   ...

  6. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  7. Android应用开发--MP3音乐播放器Service实现

    Android应用开发--MP3音乐播放器Service实现 2013年5月29日简.美音乐播放器开发记录 让网友们久等啦,关于简.美音乐播放器的开发,最重要的Service类总算是要发博了.关于An ...

  8. Android应用开发 MP3音乐播放器滚动歌词实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  9. 基于Android的MediaPlayer的音乐播放器的封装

    基于Android的MediaPlayer的音乐播放器的封装 使用过android原生的mediaplayer来做音频播放的同学们,肯定是经历过一些痛苦的,因为android提供了一个状态机,确实这个 ...

最新文章

  1. 【C语言】用宏实现将一个整数的二进制位的奇数位和偶数位交换
  2. linux 将文件分成两部分,linux 将大文件分成小文件
  3. java中处理字符编码(网页与数据库)(转)
  4. tsp 分支界限 java_干货 | 10分钟教你用branch and bound(分支定界)算法求解TSP旅行商问题...
  5. S8 Linux磁盘与文件系统管理命令
  6. mysql 查看锁_别吵吵,分布式锁也是锁
  7. Nginx开启stub_status模块配置方法_nginx
  8. python协同过滤算法_协同过滤算法介绍及算法实现
  9. 也谈政府机关服务器资源的有效利用
  10. 手把手教你学单片机,学完马上能自己编写开发程序
  11. 2020 中国大学生计算机设计大赛
  12. 指付通盗刷信用卡维权连载--9月5日维权纪实
  13. 用C语言编写高斯消元法解线性方程组
  14. 记一次图片编辑工具pinta二进制包的安装踩坑过程
  15. Initramfs文件系统的制作
  16. Linux下使用AppImageLauncher安装AppImage文件
  17. 智慧医疗服务平台有哪些优势?
  18. Linux的压缩/解压缩文件命令 zip 和 tar
  19. 日本动画现状“我是一个前动画师,有什么要问的”
  20. 中国联通5G白皮书大全(2018年发布)-随时下载

热门文章

  1. 华为od机考攻略,参考资料
  2. python学习-循环替换txt文件中的指定字符
  3. 关系型数据库篇(MSSQL)
  4. 社区发现(社团检测)模块度Modularity详细介绍
  5. java中override快捷键_Java高级应用简笔
  6. tesseract -图像识别
  7. 《剑指offer》:[22]如何判断一个序列是否为栈的弹出序列
  8. Cookie被禁用,如何传递session id?
  9. wps excel 表格粘贴到 word 删除首行缩进
  10. html怎么跟微信公众号关联,微信视频号怎么关联公众号?一步一步教你!