[Android]結合MediaPlayer和Service的音樂播放器
阿新 • • 發佈:2018-11-20
通過參照網上其他人的MP3播放器,自己也在這些基礎上小試牛刀,製作的了一個MP3的播放器,先上個介面先:
接下來就上程式碼:
首先是.mp3格式的音樂檔案的過濾類單獨在一個java檔案中:
package com.example.mediaplayer; import java.io.File; import java.io.FilenameFilter; public class MusicFilter implements FilenameFilter{ @Override public boolean accept(File dir, String filename) { // TODO Auto-generated method stub return (filename.endsWith(".mp3")); } }
下面是MainActivity.java中的程式碼(其中音量和播放進度的方法是參照網上別人的):
package com.example.mediaplayer; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.media.AudioManager; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.ListActivity; import android.content.Intent; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.ListView; import android.widget.SeekBar; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends ListActivity { public static ImageButton start_btn; private ImageButton last_btn; private ImageButton next_btn; public static SeekBar progressBar; private SeekBar volumeBar; public static List<Map<String, Object>> mList= new ArrayList<Map<String,Object>>(); public static int currentListItem=0;//當前播放歌曲的索引 @SuppressLint("SdCardPath") public static String MUSIC_PATH = new String("/mnt/sdcard/Music/"); public static AudioManager audioManager=null; private String[] mFrom=new String[]{"img","music_name"}; private int[] mTo=new int[]{R.id.img, R.id.music_name}; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); musicList(); init(); } /*初始化Button*/ private void init(){ next_btn= (ImageButton) this.findViewById(R.id.next_btn); next_btn.setOnClickListener(btnListen); start_btn = (ImageButton) this.findViewById(R.id.start_btn); start_btn.setOnClickListener(btnListen); last_btn= (ImageButton) this.findViewById(R.id.last_btn); last_btn.setOnClickListener(btnListen); volumeBar=(SeekBar) this.findViewById(R.id.volume_seekBar); progressBar =(SeekBar) this.findViewById(R.id.progressBar); /*進度條監聽*/ progressBar.setOnSeekBarChangeListener(new ProgressBarChange()); /*退出後再次進去程式時,進度條保持持續更新*/ if(PlayerService.mediaPlayer!=null){ //設定進度條最大值 MainActivity.progressBar.setMax(PlayerService.mediaPlayer.getDuration()); progressBar.setProgress(PlayerService.mediaPlayer.getCurrentPosition()); } audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); /* 把當前音量值賦給進度條 */ volumeBar.setProgress(audioManager .getStreamVolume(AudioManager.STREAM_MUSIC)); /* 監聽音量 */ volumeBar.setOnSeekBarChangeListener(new VolumeBarChang()); } /*設定按鍵監聽*/ private OnClickListener btnListen = new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.start_btn: { if(PlayerService.mediaPlayer.isPlaying()){ playMusic(AppConstant.PlayerMag.PAUSE); start_btn.setImageDrawable(getResources().getDrawable(R.drawable.pause_round)); }else{ playMusic(AppConstant.PlayerMag.PLAY); start_btn.setImageDrawable(getResources().getDrawable(R.drawable.play_round)); } } break; case R.id.next_btn: nextMusic(); break; case R.id.last_btn: frontMusic(); break; default: break; } } }; /*顯示歌曲到listView*/ public void musicList(){ File home= new File(MUSIC_PATH); File[] files=home.listFiles(new MusicFilter()); Map<String,Object> mMap = null; mList.clear(); if(files.length > 0){ for(File f:files){ mMap = new HashMap<String,Object>(); mMap.put("img", R.drawable.music_round); mMap.put("music_name", f.getName()); mList.add(mMap); } } SimpleAdapter mAdapter = new SimpleAdapter(this, mList, R.layout.item, mFrom, mTo); setListAdapter(mAdapter); } //播放音樂 public void playMusic(int action){ Intent intent = new Intent(); intent.putExtra("CMD", action); intent.putExtra("ITEM", currentListItem); intent.setClass(MainActivity.this, PlayerService.class); startService(intent); } //下一首 public void nextMusic(){ if (++currentListItem >= mList.size()) { Toast.makeText(MainActivity.this, "已到最後一首歌曲", Toast.LENGTH_SHORT) .show(); currentListItem = mList.size() - 1; } else { playMusic(AppConstant.PlayerMag.PLAY); } } //上一首 public void frontMusic(){ if (--currentListItem > 0) { playMusic(AppConstant.PlayerMag.PLAY); } else { Toast.makeText(MainActivity.this, "已到第一首歌曲", Toast.LENGTH_SHORT) .show(); currentListItem = 0; } } /* 音樂選擇監聽 * 使用者點選listview的欄目,直接播放 * */ @Override protected void onListItemClick(ListView l, View v, int position, long id) { currentListItem = position; playMusic(AppConstant.PlayerMag.PLAY); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK){ this.finish(); } return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub if(item.getItemId() == R.id.exit){ Intent intent = new Intent(); intent.setClass(MainActivity.this, PlayerService.class); stopService(intent);//停止Service MainActivity.this.finish(); } return super.onOptionsItemSelected(item); } }
其中進度和音量的實現如下:
package com.example.mediaplayer; import android.widget.SeekBar; /* * 播放進度監聽 * */ public class ProgressBarChange implements SeekBar.OnSeekBarChangeListener{ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub // 當進度條的值改變時,音樂播放器從新的位置開始播放 if(fromUser){ PlayerService.mediaPlayer.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub PlayerService.mediaPlayer.pause(); // 開始拖動進度條時,音樂暫停播放 } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub PlayerService.mediaPlayer.start();// 停止拖動進度條時,音樂開始播放 } }
package com.example.mediaplayer;
import android.media.AudioManager;
import android.widget.SeekBar;
/*
* 音量監聽
* */
public class VolumeBarChang implements SeekBar.OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
MainActivity.audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,
0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
}
最後就是service部分的了:
package com.example.mediaplayer;
import java.io.IOException;
import java.util.Map;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast;
public class PlayerService extends Service implements Runnable,
MediaPlayer.OnCompletionListener{
public static MediaPlayer mediaPlayer=null;
private static boolean isLoop=false;
private String path = null;
private int CMD;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
if(mediaPlayer != null){
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer=null;
}
mediaPlayer=new MediaPlayer();
mediaPlayer.setOnCompletionListener(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
CMD=(int)intent.getIntExtra("CMD", AppConstant.PlayerMag.PLAY);
if(CMD == AppConstant.PlayerMag.PLAY){
playMusic((int)intent.getIntExtra("ITEM",MainActivity.currentListItem));
}else if(CMD == AppConstant.PlayerMag.PAUSE){
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
new Thread(this).start();//進度條開始
return super.onStartCommand(intent, flags, startId);
}
public void playMusic(int item) {
try {
Map<String, Object> map = MainActivity.mList.get(item);
path=MainActivity.MUSIC_PATH+map.get("music_name");
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.setLooping(isLoop);
MainActivity.progressBar.setMax(PlayerService.mediaPlayer.getDuration());//設定播放進度條的最大值
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer=null;
}
}
@Override
public void run() {
int currentPosition = 0;// 設定預設進度條當前位置
int total = mediaPlayer.getDuration();//
while (mediaPlayer != null && currentPosition < total) {
try {
Thread.sleep(1000);
if (mediaPlayer != null) {
currentPosition = mediaPlayer.getCurrentPosition();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
MainActivity.progressBar.setProgress(currentPosition);
}
}
@Override
public void onCompletion(MediaPlayer mp) {
/*當前歌曲播放完,自動播放跳到下一首*/
if (++MainActivity.currentListItem >= MainActivity.mList.size()) {
Toast.makeText(PlayerService.this, "已到最後一首歌曲", Toast.LENGTH_SHORT)
.show();
MainActivity.currentListItem--;
MainActivity.progressBar.setMax(0);
} else {
playMusic(MainActivity.currentListItem);
}
MainActivity.start_btn.setImageDrawable(getResources().getDrawable(R.drawable.play_round));
}
}
業餘時間第一次去做算是比較完整小應用,其中學到真的還是很多的,其中很多是在blog的各大神中學的,
所以自己也要把這次釋出出來,希望各位大神級的多多指點下我這種菜鳥。