生活随笔
收集整理的這篇文章主要介紹了
Android应用开发--MP3音乐播放器代码实现(二)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2013年5月25日 簡(jiǎn)、美音樂播放器開發(fā)
小巫在這里羅列這個(gè)播放器已經(jīng)實(shí)現(xiàn)的功能:
1.???自動(dòng)顯示音樂列表
2.???點(diǎn)擊列表播放音樂
3.???長(zhǎng)按列表彈出對(duì)話框
4.???暫停音樂
5.???上一首音樂
6.???下一首音樂
7.???自動(dòng)播放下一首歌曲
8.???單曲循環(huán)
9.???全部循環(huán)
10.? 隨機(jī)播放
?
以上所有功能將會(huì)分為兩篇博文來講解,首先是主界面的,接著是播放界面的。在這里要說明一點(diǎn),以上功能是小巫自己一點(diǎn)一點(diǎn)調(diào)試才實(shí)現(xiàn)的,并不能完全排除考慮不周的地方,原本這個(gè)軟件實(shí)現(xiàn)起來并不太難,但確實(shí)要考慮到很多細(xì)節(jié)的地方,播放狀態(tài)的切換和控制就是一塊,也花了我不少實(shí)現(xiàn),之前還很苦惱實(shí)現(xiàn)自己想要的效果,但后來還是經(jīng)過思考和調(diào)試把功能實(shí)現(xiàn)。所以說,開發(fā)是一個(gè)需要很耐心的過程,各位童鞋,如果真正喜歡編程的話,想要做出一些小作品的話,那就好好掂量自己的耐心吧,好了,廢話不多說,先貼一大段代碼,后面在慢慢把需要注意的地方說一下。
主界面效果圖:
? ? ? ? ? ??
以上界面的效果怎么實(shí)現(xiàn)的?
很簡(jiǎn)單的,就是ListView的數(shù)據(jù)填充,但要填的的東西就要考慮了,怎么把數(shù)據(jù)從SQLite中獲取,小巫封裝了一個(gè)工具類,用來獲取與MP3相關(guān)的數(shù)據(jù)。
==>MediaUtils
[java] view plaincopy
package?com.wwj.sb.utils;????import?java.util.ArrayList;??import?java.util.HashMap;??import?java.util.Iterator;??import?java.util.List;????import?android.content.Context;??import?android.database.Cursor;??import?android.provider.MediaStore;????import?com.wwj.sb.domain.Mp3Info;????public?class?MediaUtil?{????????????????public?static?List<Mp3Info>?getMp3Infos(Context?context)?{??????????Cursor?cursor?=?context.getContentResolver().query(??????????????????MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,?null,?null,?null,??????????????????MediaStore.Audio.Media.DEFAULT_SORT_ORDER);??????????List<Mp3Info>?mp3Infos?=?new?ArrayList<Mp3Info>();??????????for?(int?i?=?0;?i?<?cursor.getCount();?i++)?{??????????????cursor.moveToNext();??????????????Mp3Info?mp3Info?=?new?Mp3Info();??????????????long?id?=?cursor.getLong(cursor??????????????????????.getColumnIndex(MediaStore.Audio.Media._ID));?????????????????????????????String?title?=?cursor.getString((cursor???????????????????????.getColumnIndex(MediaStore.Audio.Media.TITLE)));??????????????????????????String?artist?=?cursor.getString(cursor??????????????????????.getColumnIndex(MediaStore.Audio.Media.ARTIST));??????????????????????????long?duration?=?cursor.getLong(cursor??????????????????????.getColumnIndex(MediaStore.Audio.Media.DURATION));????????????????????????long?size?=?cursor.getLong(cursor??????????????????????.getColumnIndex(MediaStore.Audio.Media.SIZE));????????????????????????????String?url?=?cursor.getString(cursor??????????????????????.getColumnIndex(MediaStore.Audio.Media.DATA));????????????????????????????int?isMusic?=?cursor.getInt(cursor??????????????????????.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));????????????????????????if?(isMusic?!=?0)?{???????????????????????mp3Info.setId(id);??????????????????mp3Info.setTitle(title);??????????????????mp3Info.setArtist(artist);??????????????????mp3Info.setDuration(duration);??????????????????mp3Info.setSize(size);??????????????????mp3Info.setUrl(url);??????????????????mp3Infos.add(mp3Info);??????????????}??????????}??????????return?mp3Infos;??????}??????????????????????public?static?List<HashMap<String,?String>>?getMusicMaps(??????????????List<Mp3Info>?mp3Infos)?{??????????List<HashMap<String,?String>>?mp3list?=?new?ArrayList<HashMap<String,?String>>();??????????for?(Iterator?iterator?=?mp3Infos.iterator();?iterator.hasNext();)?{??????????????Mp3Info?mp3Info?=?(Mp3Info)?iterator.next();??????????????HashMap<String,?String>?map?=?new?HashMap<String,?String>();??????????????map.put("title",?mp3Info.getTitle());??????????????map.put("Artist",?mp3Info.getArtist());??????????????map.put("duration",?formatTime(mp3Info.getDuration()));??????????????map.put("size",?String.valueOf(mp3Info.getSize()));??????????????map.put("url",?mp3Info.getUrl());??????????????mp3list.add(map);??????????}??????????return?mp3list;??????}??????????????????????public?static?String?formatTime(long?time)?{??????????String?min?=?time?/?(1000?*?60)?+?"";??????????String?sec?=?time?%?(1000?*?60)?+?"";??????????if?(min.length()?<?2)?{??????????????min?=?"0"?+?time?/?(1000?*?60)?+?"";??????????}?else?{??????????????min?=?time?/?(1000?*?60)?+?"";??????????}??????????if?(sec.length()?==?4)?{??????????????sec?=?"0"?+?(time?%?(1000?*?60))?+?"";??????????}?else?if?(sec.length()?==?3)?{??????????????sec?=?"00"?+?(time?%?(1000?*?60))?+?"";??????????}?else?if?(sec.length()?==?2)?{??????????????sec?=?"000"?+?(time?%?(1000?*?60))?+?"";??????????}?else?if?(sec.length()?==?1)?{??????????????sec?=?"0000"?+?(time?%?(1000?*?60))?+?"";??????????}??????????return?min?+?":"?+?sec.trim().substring(0,?2);??????}??}??
好吧,來重頭戲了,一大段代碼來襲。
HomeActivity.Java
[java] view plaincopy
package?com.wwj.sb.activity;????import?java.util.HashMap;??import?java.util.List;????import?android.app.Activity;??import?android.app.AlertDialog;??import?android.app.Service;??import?android.content.BroadcastReceiver;??import?android.content.Context;??import?android.content.DialogInterface;??import?android.content.Intent;??import?android.content.IntentFilter;??import?android.graphics.Color;??import?android.os.Bundle;??import?android.os.Vibrator;??import?android.view.ContextMenu;??import?android.view.ContextMenu.ContextMenuInfo;??import?android.view.KeyEvent;??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.SimpleAdapter;??import?android.widget.TextView;??import?android.widget.Toast;????import?com.wwj.sb.domain.AppConstant;??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;???????????public?class?HomeActivity?extends?Activity?{??????private?ListView?mMusiclist;???????private?List<Mp3Info>?mp3Infos?=?null;??????private?SimpleAdapter?mAdapter;???????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?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;??????@Override??????public?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(getApplicationContext());????????????setListAdpter(MediaUtil.getMusicMaps(mp3Infos));??????????????findViewById();???????????????????????setViewOnclickListener();?????????????repeatState?=?isNoneRepeat;???????????????????????????????homeReceiver?=?new?HomeReceiver();????????????????????IntentFilter?filter?=?new?IntentFilter();????????????????????filter.addAction(UPDATE_ACTION);??????????filter.addAction(MUSIC_CURRENT);??????????filter.addAction(MUSIC_DURATION);??????????filter.addAction(REPEAT_ACTION);??????????filter.addAction(SHUFFLE_ACTION);????????????????????registerReceiver(homeReceiver,?filter);??????????????????}????????????????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);??????}????????????????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);??????}????????private?class?ViewOnClickListener?implements?OnClickListener?{??????????Intent?intent?=?new?Intent();??????????@Override??????????public?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;??????????????}??????????}??????}????????private?class?MusicListItemClickListener?implements?OnItemClickListener?{??????????????????????@Override??????????public?void?onItemClick(AdapterView<?>?parent,?View?view,?int?position,??????????????????long?id)?{??????????????listPosition?=?position;??????????????playMusic(listPosition);??????????????????}????????}????????????public?class?MusicListItemContextMenuListener?implements?OnCreateContextMenuListener?{????????????@Override??????????public?void?onCreateContextMenu(ContextMenu?menu,?View?v,??????????????????ContextMenuInfo?menuInfo)?{??????????????Vibrator?vibrator?=?(Vibrator)?getSystemService(Service.VIBRATOR_SERVICE);??????????????vibrator.vibrate(50);?????????????????????musicListItemDialog();????????????????}????????}??????????????????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?{??????????????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?{??????????????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[]{"播放音樂","設(shè)為鈴聲","查看詳情"};??????????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()?{????????????????@Override??????????????public?void?onItemClick(AdapterView<?>?parent,?View?view,??????????????????????int?position,?long?id)?{??????????????????customDialog.cancel();??????????????????customDialog.dismiss();??????????????}????????????????????????});??????}??????public?void?playMusic(int?listPosition)?{??????????if?(mp3Infos?!=?null)?{??????????????Mp3Info?mp3Info?=?mp3Infos.get(listPosition);??????????????musicTitle.setText(mp3Info.getTitle());??????????????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("repeatState",?repeatState);??????????????intent.putExtra("shuffleState",?isShuffle);??????????????intent.putExtra("MSG",?AppConstant.PlayerMsg.PLAY_MSG);??????????????startActivity(intent);??????????}??????}????????????@Override??????protected?void?onStop()?{????????????????????super.onStop();??????}??????????????????@Override??????protected?void?onDestroy()?{????????????????????super.onDestroy();??????}????????????????????@Override??????public?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()?{????????????????????????????????????@Override??????????????????????????????????public?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);??????}????????????????????????public?class?HomeReceiver?extends?BroadcastReceiver?{????????????@Override??????????public?void?onReceive(Context?context,?Intent?intent)?{??????????????String?action?=?intent.getAction();???????????????if(action.equals(MUSIC_CURRENT)){????????????????????????????????????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))?{????????????????????????????????????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);??????????????????}??????????????}??????????}????????????????}??}??
到這里,要開講啦。
以下是需要注意的幾點(diǎn):
1. 音樂是通過Service來播放的,Activity通過啟動(dòng)服務(wù)來實(shí)現(xiàn)在后臺(tái)播放音樂。
2. Activity中自定義了一個(gè)廣播接收器,需要進(jìn)行intent過濾器的定義,動(dòng)作的添加,注冊(cè)廣播接收器:
[java] view plaincopy
<span?style="white-space:pre">??????</span>homeReceiver?=?new?HomeReceiver();????????????????????IntentFilter?filter?=?new?IntentFilter();????????????????????filter.addAction(UPDATE_ACTION);??????????filter.addAction(MUSIC_CURRENT);??????????filter.addAction(MUSIC_DURATION);??????????filter.addAction(REPEAT_ACTION);??????????filter.addAction(SHUFFLE_ACTION);????????????????????registerReceiver(homeReceiver,?filter);????????????
3. 在廣播接收器類當(dāng)中對(duì)動(dòng)作進(jìn)行處理,比如實(shí)現(xiàn)時(shí)間的更新和標(biāo)題的更新等。
4. 這里還要注意按鈕觸發(fā),播放狀態(tài)的改變,比如音樂循環(huán),有三種狀態(tài):單曲、全部循環(huán)、順序,每切換一個(gè)狀態(tài)都要向服務(wù)發(fā)送一條廣播,通知它要改變狀態(tài)。
5. 點(diǎn)擊列表的時(shí)候,會(huì)跳入到播放界面的Activity中,要注意用intent來傳遞參數(shù),注意每個(gè)參數(shù)的用途,比如title、url、MSG,就分別代表標(biāo)題、路徑、播放狀態(tài)。
6. 長(zhǎng)按列表會(huì)彈出自定義對(duì)話框,也會(huì)有短暫的震動(dòng)效果,自定義對(duì)話框需要自行實(shí)現(xiàn)。這里我也貼一下實(shí)現(xiàn)代碼吧。
[java] view plaincopy
package?com.wwj.sb.utils;??????import?android.app.Activity;??import?android.app.Dialog;??import?android.content.Context;??import?android.content.DialogInterface;??import?android.text.TextUtils;??import?android.view.LayoutInflater;??import?android.view.View;??import?android.view.ViewGroup;??import?android.view.ViewGroup.LayoutParams;??import?android.widget.Button;??import?android.widget.FrameLayout;??import?android.widget.ImageView;??import?android.widget.LinearLayout;??import?android.widget.TextView;????import?com.wwj.sb.activity.R;???????????public?class?CustomDialog?extends?Dialog?{????????public?CustomDialog(Context?context)?{??????????super(context);??????}????????public?CustomDialog(Context?context,?int?theme)?{??????????super(context,?theme);??????}????????public?static?class?Builder?{????????????private?Context?context;??????????private?int?mIcon?=?-1;???????????private?CharSequence?mTitle;???????????private?CharSequence?mMessage;???????????private?CharSequence?mPositiveButtonText;???????????private?CharSequence?mNegativeButtonText;???????????private?CharSequence?mNeutralButtonText;???????????private?boolean?mCancelable?=?true;?????????????private?int?mViewSpacingLeft;??????????private?int?mViewSpacingTop;??????????private?int?mViewSpacingRight;??????????private?int?mViewSpacingBottom;??????????private?boolean?mViewSpacingSpecified?=?false;??????????????????????private?View?mView;??????????????????????private?OnClickListener?mPositiveButtonClickListener,??????????????????mNegativeButtonClickListener,?mNeutralButtonClickListener;??????????private?OnCancelListener?mCancelListener;???????????private?OnKeyListener?mKeyListener;?????????????public?Builder(Context?context)?{??????????????this.context?=?context;??????????}????????????public?Builder?setMessage(CharSequence?message)?{??????????????this.mMessage?=?message;??????????????return?this;??????????}????????????public?Builder?setMessage(int?message)?{??????????????this.mMessage?=?context.getText(message);??????????????return?this;??????????}????????????public?Builder?setTitle(int?title)?{??????????????this.mTitle?=?context.getText(title);??????????????return?this;??????????}????????????public?Builder?setTitle(CharSequence?title)?{??????????????this.mTitle?=?title;??????????????return?this;??????????}????????????public?Builder?setIcon(int?icon)?{??????????????this.mIcon?=?icon;??????????????return?this;??????????}????????????public?Builder?setView(View?view)?{??????????????this.mView?=?view;??????????????mViewSpacingSpecified?=?false;??????????????return?this;??????????}????????????public?Builder?setView(View?view,?int?left,?int?top,?int?right,??????????????????int?bottom)?{??????????????this.mView?=?view;??????????????this.mViewSpacingLeft?=?left;??????????????this.mViewSpacingTop?=?top;??????????????this.mViewSpacingRight?=?right;??????????????this.mViewSpacingBottom?=?bottom;??????????????mViewSpacingSpecified?=?true;??????????????return?this;??????????}????????????public?Builder?setPositonButton(int?textId,??????????????????final?OnClickListener?listener)?{??????????????this.mPositiveButtonText?=?context.getText(textId);??????????????this.mPositiveButtonClickListener?=?listener;??????????????return?this;??????????}????????????public?Builder?setPostionButton(String?text,??????????????????final?OnClickListener?listener)?{??????????????this.mPositiveButtonText?=?text;??????????????this.mPositiveButtonClickListener?=?listener;??????????????return?this;??????????}????????????public?Builder?setNeutralButton(int?textId,??????????????????final?OnClickListener?listener)?{??????????????this.mNeutralButtonText?=?context.getText(textId);??????????????this.mNeutralButtonClickListener?=?listener;??????????????return?this;??????????}????????????????????public?Builder?setNeutralButton(String?text,?final?OnClickListener?listener)?{??????????????this.mNeutralButtonText?=?text;??????????????this.mNeutralButtonClickListener?=?listener;??????????????return?this;??????????}??????????public?Builder?setNegativeButton(int?textId,??????????????????final?OnClickListener?listener)?{??????????????this.mNegativeButtonText?=?context.getText(textId);??????????????this.mNegativeButtonClickListener?=?listener;??????????????return?this;??????????}????????????public?Builder?setNegativeButton(String?text,??????????????????final?OnClickListener?listener)?{??????????????this.mNegativeButtonText?=?text;??????????????this.mNegativeButtonClickListener?=?listener;??????????????return?this;??????????}??????????????????????????????public?Builder?setCancelable(boolean?cancelable)?{??????????????this.mCancelable?=?cancelable;??????????????return?this;??????????}????????????????????public?Builder?setOnCancelListener(OnCancelListener?listener)?{??????????????this.mCancelListener?=?listener;??????????????return?this;??????????}????????????????????public?Builder?setOnKeyListener(OnKeyListener?listener)?{??????????????this.mKeyListener?=?listener;??????????????return?this;??????????}????????????????????public?CustomDialog?create()?{??????????????LayoutInflater?inflater?=?(LayoutInflater)?context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);??????????????final?CustomDialog?dialog?=?new?CustomDialog(context,?R.style.CustomDialog);??????????????dialog.setCancelable(mCancelable);????????????????????????????if(mCancelListener?!=?null)?{??????????????????dialog.setOnCancelListener(mCancelListener);??????????????}????????????????????????????if(mKeyListener?!=?null)?{??????????????????dialog.setOnKeyListener(mKeyListener);??????????????}????????????????????????????View?layout?=?inflater.inflate(R.layout.alert_dialog,?(ViewGroup)(((Activity)context).findViewById(R.id.parentPanel)));??????????????layout.setLayoutParams(new?LayoutParams(LayoutParams.MATCH_PARENT,?LayoutParams.WRAP_CONTENT));??????????????????????????????????????????((TextView)?layout.findViewById(R.id.alertTitle)).setText(mTitle);????????????????????????????if(mIcon?!=?-1)?{??????????????????((ImageView)?layout.findViewById(R.id.icon))??????????????????.setBackgroundResource(mIcon);??????????????}????????????????????????????int?count?=?0;????????????????????????????if(setButton(layout,?mPositiveButtonText,?R.id.button1,?dialog,?mPositiveButtonClickListener))?count++;????????????????????????????if(setButton(layout,?mNegativeButtonText,?R.id.button2,?dialog,?mNegativeButtonClickListener))?count++;????????????????????????????if(setButton(layout,?mNeutralButtonText,?R.id.button3,?dialog,?mNeutralButtonClickListener))?count++;????????????????????????????if(count?==?0)?{??????????????????layout.findViewById(R.id.buttonPanel).setVisibility(View.GONE);??????????????}????????????????????????????if(count?==?1)?{??????????????????layout.findViewById(R.id.leftSpacer)??????????????????????.setVisibility(View.INVISIBLE);??????????????????layout.findViewById(R.id.rightSpacer).setVisibility(View.INVISIBLE);??????????????}????????????????????????????if(!TextUtils.isEmpty(mMessage))?{??????????????????((TextView)layout.findViewById(R.id.message))??????????????????????.setText(mMessage);??????????????}?else?{??????????????????((LinearLayout)?layout.findViewById(R.id.contentPanel))??????????????????????.setVisibility(View.GONE);??????????????}????????????????????????????if(mView?!=?null)?{??????????????????final?FrameLayout?customPanel?=?(FrameLayout)?layout??????????????????????????.findViewById(R.id.customPanel);??????????????????if(mViewSpacingSpecified)?{??????????????????????customPanel.setPadding(mViewSpacingLeft,?mViewSpacingTop,?mViewSpacingRight,?mViewSpacingBottom);??????????????????}??????????????????customPanel.addView(mView);??????????????}?else?{??????????????????((FrameLayout)?layout.findViewById(R.id.customPanel))??????????????????????????????.setVisibility(View.GONE);??????????????}??????????????dialog.setContentView(layout);??????????????return?dialog;????????????????????????????}????????????????????public?CustomDialog?show()?{??????????????CustomDialog?dialog?=?create();??????????????dialog.show();??????????????return?dialog;??????????}????????????????????private?boolean?setButton(View?layout,?CharSequence?mPositiveButtonText,?int?id,?final?Dialog?dialog,?final?OnClickListener?listener)?{??????????????if(!TextUtils.isEmpty(mPositiveButtonText))?{??????????????????final?Button?button?=?(Button)?layout.findViewById(id);??????????????????button.setText(mPositiveButtonText);??????????????????if(listener?!=?null)?{??????????????????????button.setOnClickListener(new?View.OnClickListener()?{????????????????????????????????????????????????????@Override??????????????????????????public?void?onClick(View?v)?{??????????????????????????????listener.onClick(dialog,?DialogInterface.BUTTON_POSITIVE);??????????????????????????}??????????????????????});??????????????????}?else?{????????????????????????????????????????????button.setOnClickListener(new?View.OnClickListener()?{????????????????????????????????????????????????????@Override??????????????????????????public?void?onClick(View?v)?{??????????????????????????????dialog.cancel();??????????????????????????????dialog.dismiss();??????????????????????????}??????????????????????});??????????????????}??????????????????return?true;??????????????}?else?{??????????????????layout.findViewById(id).setVisibility(View.GONE);??????????????????return?false;??????????????}??????????}??????}??}??
關(guān)于主界面的業(yè)務(wù)邏輯具體實(shí)現(xiàn)和需要注意的地方,小巫已經(jīng)說完了。其實(shí)最重要的是要寫好服務(wù)類,下一篇播放將會(huì)給童鞋們介紹服務(wù)類的實(shí)現(xiàn)。最后感謝大家的關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的Android应用开发--MP3音乐播放器代码实现(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。