android開發之MediaPlayer+Service MP3播放器

來源:互聯網
上載者:User
import java.io.File;import java.io.FilenameFilter;import java.util.ArrayList;import java.util.List;import android.app.ListActivity;import android.apps.service.PlayerService;import android.content.Intent;import android.media.AudioManager;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.SeekBar;import android.widget.Toast;public class TestMediaPlayer extends ListActivity {/* 前段時間剛學習Android時就覺得MediaPlayer是個很神奇的東西,就試著做了個簡單的音樂播放器。 * 支援後台播放、進度條拖放、音量控制、讀取sdCard音樂檔案進行播放等。 * */private Button playButton = null;private Button mFrontButton = null;private Button mLastButton = null;private Button exit = null;/* 聲明音量管理器 */private AudioManager mAudioManager = null;/* 定義進度條 */public static SeekBar audioSeekBar = null;/* 定義音量大小 */private SeekBar audioVolume = null;/* 定於一個資料播放清單,用來存放從指定檔案中搜尋到的檔案 */public static List<String> mMusicList = new ArrayList<String>();/* 定義音樂存放路徑 *///private static final String MUSIC_PATH = new String("/mnt/sdcard/"); //android 2.2private static final String MUSIC_PATH = new String("/sdcard/");//android 2.1/* 定義在播放清單中的當前選擇項 */public static int currentListItme = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 更新列表 */musicList();/* 得到控制項 */playButton = (Button) findViewById(R.id.StartMusic);mFrontButton = (Button) findViewById(R.id.FrontButton);mLastButton = (Button) findViewById(R.id.LastMusic);audioVolume = (SeekBar) findViewById(R.id.audioVolume);exit = (Button)findViewById(R.id.exit);audioSeekBar = (SeekBar) findViewById(R.id.seekbar01);/* 播放、暫停監聽 */playButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {playMusic(AppConstant.PlayerMag.PAUSE);}});/* 監聽下一首 */mFrontButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {nextMusic();}});/* 監聽上一首 */mLastButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {FrontMusic();}});/*退出監聽*/exit.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setClass(TestMediaPlayer.this, PlayerService.class);stopService(intent);//停止Servicetry {TestMediaPlayer.this.finish();//關閉當前Activity} catch (Throwable e) {e.printStackTrace();}}});/* 播放進度監聽 */audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());/*退出後再次進去程式時,進度條保持持續更新*/if(PlayerService.mMediaPlayer!=null){//設定進度條最大值TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration());audioSeekBar.setProgress(PlayerService.mMediaPlayer.getCurrentPosition());}/* 得到當前音量對象 */mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);/* 把當前音量值賦給進度條 */audioVolume.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));/* 監聽音量 */audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());}public void playMusic(int action) {Intent intent = new Intent();intent.putExtra("MSG", action);intent.setClass(TestMediaPlayer.this, PlayerService.class);/* 啟動service service要在AndroidManifest.xml註冊如:<service></service>*/startService(intent);}/* 檢測sdcard MP3檔案並加入到List列表 */public void musicList() {// 先清除list中的緩衝mMusicList.clear();/* 從指定的路徑中讀取檔案,並與播放清單關聯 */File home = new File(MUSIC_PATH);System.out.println(home.canRead());/* 讀取指定類型的檔案,在本程式,指定播放類型為mp3 */if (home.listFiles(new MusicFilter()).length > 0) {/* 讀取檔案 */for (File file : home.listFiles(new MusicFilter())) {mMusicList.add(file.getName());}/* 播放檔案與播放清單關聯 */ArrayAdapter<String> musicList = new ArrayAdapter<String>(TestMediaPlayer.this, R.layout.musictime, mMusicList);setListAdapter(musicList);}}/* 音量監聽 */class AudioVolumeChangeEvent implements SeekBar.OnSeekBarChangeListener {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// mAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0);mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,0);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}}/* 音樂選擇監聽 */@Overrideprotected void onListItemClick(android.widget.ListView l, View v,int position, long id) {super.onListItemClick(l, v, position, id);currentListItme = position;playMusic(AppConstant.PlayerMag.PLAY_MAG);}/* 播放下一首 */private void nextMusic() {if (++currentListItme >= mMusicList.size()) {Toast.makeText(TestMediaPlayer.this, "已到最後一首歌曲", Toast.LENGTH_SHORT).show();currentListItme = mMusicList.size() - 1;} else {playMusic(AppConstant.PlayerMag.PLAY_MAG);}}/* 播放上一首歌曲 */private void FrontMusic() {if (--currentListItme >= 0) {playMusic(AppConstant.PlayerMag.PLAY_MAG);} else {Toast.makeText(TestMediaPlayer.this, "已到第一首歌曲", Toast.LENGTH_SHORT).show();currentListItme = 0;}}}/* 播放檔案選擇類 */class MusicFilter implements FilenameFilter {public boolean accept(File dir, String name) {/* 指定副檔名類型 ,可以加其他的音樂格式*/return (name.endsWith(".mp3"));}}/* 拖放進度監聽 ,別忘了Service裡面還有個進度條重新整理*/class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {/*假設改變源於使用者拖動*/if (fromUser) {PlayerService.mMediaPlayer.seekTo(progress);// 當進度條的值改變時,音樂播放器從新的位置開始播放}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {PlayerService.mMediaPlayer.pause(); // 開始拖動進度條時,音樂暫停播放}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {PlayerService.mMediaPlayer.start(); // 停止拖動進度條時,音樂開始播放}}

service類

首先建議不要把播放音樂放在Activity中,因為關閉Activity後就不能實現後台播放。所以播放音樂要放在Service中,我們只需要管理Activity與Service間的通訊就好了。下面就是個Service類。直接看注釋和代碼:

package android.apps.service;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.net.Uri;import android.os.IBinder;import android.widget.Toast;import android.apps.*;public class PlayerService extends Service implements Runnable,MediaPlayer.OnCompletionListener {/* 定於一個多媒體對象 */public static MediaPlayer mMediaPlayer = null;// 是否單曲迴圈private static boolean isLoop = false;// 使用者操作private int MSG;/* 定義要播放的檔案夾路徑 */private static final String MUSIC_PATH = new String("/sdcard/");@Overridepublic IBinder onBind(Intent intent) {return null;// 這裡的綁定沒的用,上篇我貼出了如何將activity與service綁定的代碼}@Overridepublic void onCreate() {super.onCreate();if (mMediaPlayer != null) {mMediaPlayer.reset();mMediaPlayer.release();mMediaPlayer = null;}mMediaPlayer = new MediaPlayer();/* 監聽播放是否完成 */mMediaPlayer.setOnCompletionListener(this);}@Overridepublic void onDestroy() {super.onDestroy();if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;}System.out.println("service onDestroy");}    /*啟動service時執行的方法*/@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {/*得到從startService傳來的動作,後是預設參數,這裡是我自訂的常量*/MSG = intent.getIntExtra("MSG", AppConstant.PlayerMag.PLAY_MAG);if (MSG == AppConstant.PlayerMag.PLAY_MAG) {playMusic();}if (MSG == AppConstant.PlayerMag.PAUSE) {if (mMediaPlayer.isPlaying()) {// 現正播放mMediaPlayer.pause();// 暫停} else {// 沒有播放mMediaPlayer.start();}}return super.onStartCommand(intent, flags, startId);}@SuppressWarnings("static-access")public void playMusic() {try {/* 重設多媒體 */mMediaPlayer.reset();/* 讀取mp3檔案 */mMediaPlayer.setDataSource(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));//Uri uri = Uri.parse(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));////mMediaPlayer.create(PlayerService.this,uri);/* 準備播放 */mMediaPlayer.prepare();/* 開始播放 */mMediaPlayer.start();/* 是否單曲迴圈 */mMediaPlayer.setLooping(isLoop);// 設定進度條最大值TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration());new Thread(this).start();} catch (IOException e) {}}// 重新整理進度條@Overridepublic void run() {int CurrentPosition = 0;// 設定預設進度條當前位置int total = mMediaPlayer.getDuration();//while (mMediaPlayer != null && CurrentPosition < total) {try {Thread.sleep(1000);if (mMediaPlayer != null) {CurrentPosition = mMediaPlayer.getCurrentPosition();}} catch (InterruptedException e) {e.printStackTrace();}TestMediaPlayer.audioSeekBar.setProgress(CurrentPosition);}}@Overridepublic void onCompletion(MediaPlayer mp) {/* 播放完當前歌曲,自動播放下一首 */if (++TestMediaPlayer.currentListItme >= TestMediaPlayer.mMusicList.size()) {Toast.makeText(PlayerService.this, "已到最後一首歌曲", Toast.LENGTH_SHORT).show();TestMediaPlayer.currentListItme--;TestMediaPlayer.audioSeekBar.setMax(0);} else {playMusic();}}}

參數封裝

/** * @把參數這樣封裝易於管理和閱讀 * */public interface AppConstant {public class PlayerMag{public static final int PLAY_MAG=1;//開始播放public static final int PAUSE=2;//暫停播放}}

詳細代碼下載:http://download.csdn.net/source/3318587

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.