日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2025/3/15 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?{??
  • ????/**?
  • ?????*?用于從數(shù)據(jù)庫(kù)中查詢歌曲的信息,保存在List當(dāng)中?
  • ?????*??
  • ?????*?@return?
  • ?????*/??
  • ????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));???????????????//音樂id??
  • ????????????String?title?=?cursor.getString((cursor???
  • ????????????????????.getColumnIndex(MediaStore.Audio.Media.TITLE)));????????????//音樂標(biāo)題??
  • ????????????String?artist?=?cursor.getString(cursor??
  • ????????????????????.getColumnIndex(MediaStore.Audio.Media.ARTIST));????????????//藝術(shù)家??
  • ????????????long?duration?=?cursor.getLong(cursor??
  • ????????????????????.getColumnIndex(MediaStore.Audio.Media.DURATION));??????????//時(shí)長(zhǎng)??
  • ????????????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)?{?????//只把音樂添加到集合當(dāng)中??
  • ????????????????mp3Info.setId(id);??
  • ????????????????mp3Info.setTitle(title);??
  • ????????????????mp3Info.setArtist(artist);??
  • ????????????????mp3Info.setDuration(duration);??
  • ????????????????mp3Info.setSize(size);??
  • ????????????????mp3Info.setUrl(url);??
  • ????????????????mp3Infos.add(mp3Info);??
  • ????????????}??
  • ????????}??
  • ????????return?mp3Infos;??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?往List集合中添加Map對(duì)象數(shù)據(jù),每一個(gè)Map對(duì)象存放一首音樂的所有屬性?
  • ?????*?@param?mp3Infos?
  • ?????*?@return?
  • ?????*/??
  • ????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;??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?格式化時(shí)間,將毫秒轉(zhuǎn)換為分:秒格式?
  • ?????*?@param?time?
  • ?????*?@return?
  • ?????*/??
  • ????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;??
  • ??
  • /**?
  • ?*?2013/5/7?
  • ?*?簡(jiǎn)、美音樂播放器?
  • ?*?@author?wwj?
  • ?*??
  • ?*/??
  • public?class?HomeActivity?extends?Activity?{??
  • ????private?ListView?mMusiclist;?//?音樂列表??
  • ????private?List<Mp3Info>?mp3Infos?=?null;??
  • ????private?SimpleAdapter?mAdapter;?//?簡(jiǎn)單適配器??
  • ????private?Button?previousBtn;?//?上一首??
  • ????private?Button?repeatBtn;?//?重復(fù)(單曲循環(huán)、全部循環(huán))??
  • ????private?Button?playBtn;?//?播放(播放、暫停)??
  • ????private?Button?shuffleBtn;?//?隨機(jī)播放??
  • ????private?Button?nextBtn;?//?下一首??
  • ????private?TextView?musicTitle;//歌曲標(biāo)題??
  • ????private?TextView?musicDuration;?//歌曲時(shí)間??
  • ????private?Button?musicPlaying;????//歌曲專輯??
  • ??
  • ????private?int?repeatState;????????//循環(huán)標(biāo)識(shí)??
  • ????private?final?int?isCurrentRepeat?=?1;?//?單曲循環(huán)??
  • ????private?final?int?isAllRepeat?=?2;?//?全部循環(huán)??
  • ????private?final?int?isNoneRepeat?=?3;?//?無重復(fù)播放??
  • ????private?boolean?isFirstTime?=?true;???
  • ????private?boolean?isPlaying;?//?正在播放??
  • ????private?boolean?isPause;?//?暫停??
  • ????private?boolean?isNoneShuffle?=?true;?//?順序播放??
  • ????private?boolean?isShuffle?=?false;?//?隨機(jī)播放??
  • ??????
  • ??????
  • ????private?int?listPosition?=?0;???//標(biāo)識(shí)列表位置??
  • ????private?HomeReceiver?homeReceiver;??//自定義的廣播接收器??
  • ????//一系列動(dòng)作??
  • ????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());??//獲取歌曲對(duì)象集合??
  • ????????setListAdpter(MediaUtil.getMusicMaps(mp3Infos));????//顯示歌曲列表??
  • ????????findViewById();?????????????//找到界面上的每一個(gè)控件??
  • ????????setViewOnclickListener();???//為一些控件設(shè)置監(jiān)聽器??
  • ????????repeatState?=?isNoneRepeat;?//?初始狀態(tài)為無重復(fù)播放狀態(tài)??
  • ??????????
  • ??????????
  • ????????homeReceiver?=?new?HomeReceiver();??
  • ????????//?創(chuàng)建IntentFilter??
  • ????????IntentFilter?filter?=?new?IntentFilter();??
  • ????????//?指定BroadcastReceiver監(jiān)聽的Action??
  • ????????filter.addAction(UPDATE_ACTION);??
  • ????????filter.addAction(MUSIC_CURRENT);??
  • ????????filter.addAction(MUSIC_DURATION);??
  • ????????filter.addAction(REPEAT_ACTION);??
  • ????????filter.addAction(SHUFFLE_ACTION);??
  • ????????//?注冊(cè)BroadcastReceiver??
  • ????????registerReceiver(homeReceiver,?filter);??
  • ??????????
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?從界面上根據(jù)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);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?給每一個(gè)按鈕設(shè)置監(jiān)聽器?
  • ?????*/??
  • ????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:?//?重復(fù)播放??
  • ????????????????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:?//?單曲循環(huán)??
  • ????????????????????repeatBtn??
  • ????????????????????????????.setBackgroundResource(R.drawable.repeat_current_selector);??
  • ????????????????????Toast.makeText(HomeActivity.this,?R.string.repeat_current,??
  • ????????????????????????????Toast.LENGTH_SHORT).show();??
  • ????????????????????break;??
  • ????????????????case?isAllRepeat:?//?全部循環(huán)??
  • ????????????????????repeatBtn??
  • ????????????????????????????.setBackgroundResource(R.drawable.repeat_all_selector);??
  • ????????????????????Toast.makeText(HomeActivity.this,?R.string.repeat_all,??
  • ????????????????????????????Toast.LENGTH_SHORT).show();??
  • ????????????????????break;??
  • ????????????????case?isNoneRepeat:?//?無重復(fù)??
  • ????????????????????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:?//?隨機(jī)播放??
  • ????????????????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?{??
  • ????????/**?
  • ?????????*?點(diǎn)擊列表播放音樂?
  • ?????????*/??
  • ????????@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);???????//長(zhǎng)按振動(dòng)??
  • ????????????musicListItemDialog();??????//長(zhǎng)按后彈出的對(duì)話框??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?填充列表?
  • ?????*??
  • ?????*?@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?{??
  • ????????????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);??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?單曲循環(huán)?
  • ?????*/??
  • ????public?void?repeat_one()?{??
  • ????????Intent?intent?=?new?Intent(CTL_ACTION);??
  • ????????intent.putExtra("control",?1);??
  • ????????sendBroadcast(intent);??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?全部循環(huán)?
  • ?????*/??
  • ????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);??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?隨機(jī)播放?
  • ?????*/??
  • ????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()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onStop();??
  • ????}??
  • ??????
  • ??????
  • ????@Override??
  • ????protected?void?onDestroy()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onDestroy();??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?按返回鍵彈出對(duì)話框確定退出?
  • ?????*/??
  • ????@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);?//?停止后臺(tái)服務(wù)??
  • ????????????????????????????????}??
  • ????????????????????????????}).show();??
  • ??
  • ????????}??
  • ????????return?super.onKeyDown(keyCode,?event);??
  • ????}??
  • ??????
  • ??????
  • ????//自定義的BroadcastReceiver,負(fù)責(zé)監(jiān)聽從Service傳回來的廣播??
  • ????public?class?HomeReceiver?extends?BroadcastReceiver?{??
  • ??
  • ????????@Override??
  • ????????public?void?onReceive(Context?context,?Intent?intent)?{??
  • ????????????String?action?=?intent.getAction();???
  • ????????????if(action.equals(MUSIC_CURRENT)){??
  • ????????????????//currentTime代表當(dāng)前播放的時(shí)間??
  • ????????????????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代表當(dāng)前正在播放的歌曲??
  • ????????????????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:?//?單曲循環(huán)??
  • ????????????????????repeatBtn??
  • ????????????????????????????.setBackgroundResource(R.drawable.repeat_current_selector);??
  • ????????????????????shuffleBtn.setClickable(false);??
  • ????????????????????break;??
  • ????????????????case?isAllRepeat:?//?全部循環(huán)??
  • ????????????????????repeatBtn??
  • ????????????????????????????.setBackgroundResource(R.drawable.repeat_all_selector);??
  • ????????????????????shuffleBtn.setClickable(false);??
  • ????????????????????break;??
  • ????????????????case?isNoneRepeat:?//?無重復(fù)??
  • ????????????????????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();??
  • ????????//?創(chuàng)建IntentFilter??
  • ????????IntentFilter?filter?=?new?IntentFilter();??
  • ????????//?指定BroadcastReceiver監(jiān)聽的Action??
  • ????????filter.addAction(UPDATE_ACTION);??
  • ????????filter.addAction(MUSIC_CURRENT);??
  • ????????filter.addAction(MUSIC_DURATION);??
  • ????????filter.addAction(REPEAT_ACTION);??
  • ????????filter.addAction(SHUFFLE_ACTION);??
  • ????????//?注冊(cè)BroadcastReceiver??
  • ????????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;??
  • ??
  • /**?
  • ?*?自定義對(duì)話框類?
  • ?*??
  • ?*?@author?wwj?
  • ?*??
  • ?*/??
  • 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;?//?提示圖標(biāo)??
  • ????????private?CharSequence?mTitle;?//?提示標(biāo)題??
  • ????????private?CharSequence?mMessage;?//?提示內(nèi)容??
  • ????????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;??
  • ??
  • ????????//?提示內(nèi)容View??
  • ????????private?View?mView;??
  • ??
  • ????????//?各種觸發(fā)事件??
  • ????????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);??
  • ????????????//設(shè)置取消鍵事件??
  • ????????????if(mCancelListener?!=?null)?{??
  • ????????????????dialog.setOnCancelListener(mCancelListener);??
  • ????????????}??
  • ????????????//設(shè)置鍵盤監(jiān)聽事件??
  • ????????????if(mKeyListener?!=?null)?{??
  • ????????????????dialog.setOnKeyListener(mKeyListener);??
  • ????????????}??
  • ????????????//獲取對(duì)話框布局??
  • ????????????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));??
  • ??????????????
  • ????????????//設(shè)置標(biāo)題??
  • ????????????((TextView)?layout.findViewById(R.id.alertTitle)).setText(mTitle);??
  • ????????????//設(shè)置圖標(biāo)??
  • ????????????if(mIcon?!=?-1)?{??
  • ????????????????((ImageView)?layout.findViewById(R.id.icon))??
  • ????????????????.setBackgroundResource(mIcon);??
  • ????????????}??
  • ??????????????
  • ????????????int?count?=?0;??
  • ????????????//設(shè)置確定按鈕??
  • ????????????if(setButton(layout,?mPositiveButtonText,?R.id.button1,?dialog,?mPositiveButtonClickListener))?count++;??
  • ????????????//?設(shè)置拒絕按鈕??
  • ????????????if(setButton(layout,?mNegativeButtonText,?R.id.button2,?dialog,?mNegativeButtonClickListener))?count++;??
  • ????????????//?設(shè)置中間按鈕??
  • ????????????if(setButton(layout,?mNeutralButtonText,?R.id.button3,?dialog,?mNeutralButtonClickListener))?count++;??
  • ??????????????
  • ????????????if(count?==?0)?{??
  • ????????????????layout.findViewById(R.id.buttonPanel).setVisibility(View.GONE);??
  • ????????????}??
  • ????????????//一個(gè)按鈕時(shí),顯示兩邊空間??
  • ????????????if(count?==?1)?{??
  • ????????????????layout.findViewById(R.id.leftSpacer)??
  • ????????????????????.setVisibility(View.INVISIBLE);??
  • ????????????????layout.findViewById(R.id.rightSpacer).setVisibility(View.INVISIBLE);??
  • ????????????}??
  • ????????????//設(shè)置提示消息??
  • ????????????if(!TextUtils.isEmpty(mMessage))?{??
  • ????????????????((TextView)layout.findViewById(R.id.message))??
  • ????????????????????.setText(mMessage);??
  • ????????????}?else?{??
  • ????????????????((LinearLayout)?layout.findViewById(R.id.contentPanel))??
  • ????????????????????.setVisibility(View.GONE);??
  • ????????????}??
  • ????????????//設(shè)置提示內(nèi)容布局??
  • ????????????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?{??
  • ????????????????????//默認(rèn)事件為關(guān)閉對(duì)話框??
  • ????????????????????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ò),歡迎將生活随笔推薦給好友。