package com.example.mp3;
import java.io.*;
import java.util.*;
import android.app.*;
import android.media.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class MP3 extends Activity {
ArrayList<String> mList;
int mIdx;
MediaPlayer mPlayer;
AudioManager mAm;
Button mPlayBtn;
TextView mFileName;
SeekBar mProgress;
boolean wasPlaying;
CheckBox mLoop;
TextView mPlayTime;
private int currentPosition = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mp3);
mList = new ArrayList<String>();
mPlayer = new MediaPlayer();
// SD 카드가 없을 시 에러 처리한다.
String ext = Environment.getExternalStorageState();
String sdPath;
if (ext.equals(Environment.MEDIA_MOUNTED) == false) {
Toast.makeText(this, "SD 카드가 반드시 필요합니다.", 1).show();
finish();
return;
}
// SD 카드 루트의 MP3 파일 목록을 구한다.
sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
File sdRoot = new File(sdPath);
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".mp3");
}
};
String[] mplist = sdRoot.list(filter);
if (mplist.length == 0) {
Toast.makeText(this, "재생할 파일이 없습니다.", 1).show();
finish();
return;
}
for(String s : mplist) {
mList.add(sdPath + "/" + s);
}
mIdx = 0;
//어댑터 생성, 등록
ArrayAdapter<String> Adapter;
Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList);
ListView musiclist = (ListView)findViewById(R.id.musiclist);
musiclist.setAdapter(Adapter);
musiclist.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// 버튼들의 클릭 리스너 등록
mFileName = (TextView)findViewById(R.id.title);
mPlayBtn = (Button)findViewById(R.id.play);
// 완료 리스너, 시크바 변경 리스너 등록
mPlayer.setOnCompletionListener(mOnComplete);
mPlayer.setOnSeekCompleteListener(mOnSeekComplete);
mProgress = (SeekBar)findViewById(R.id.seekBar);
mProgress.setOnSeekBarChangeListener(mOnSeek);
mProgressHandler.sendEmptyMessageDelayed(0,200);
mAm = (AudioManager)getSystemService(AUDIO_SERVICE);
SeekBar seek = (SeekBar)findViewById(R.id.volume);
seek.setMax(mAm.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
seek.setProgress(mAm.getStreamVolume(AudioManager.STREAM_MUSIC));
seek.setOnSeekBarChangeListener(mOnSeekv);
CheckBox mLoop = (CheckBox)findViewById(R.id.repeat);
mLoop.setOnCheckedChangeListener(mOnLoop);
TextView mPlayTime = (TextView)findViewById(R.id.playtime);
// 첫 곡 읽기 및 준비
if (LoadMedia(mIdx) == false) {
Toast.makeText(this, "파일을 읽을 수 없습니다.", 1).show();
finish();
}
}
// 액티비티 종료시 재생 강제 종료
public void onDestroy() {
super.onDestroy();
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
// 항상 준비 상태여야 한다.
boolean LoadMedia(int idx) {
try {
mPlayer.setDataSource(mList.get(idx));
} catch (IllegalArgumentException e) {
return false;
} catch (IllegalStateException e) {
return false;
} catch (IOException e) {
return false;
}
if (Prepare() == false) {
return false;
}
mFileName.setText("파일 : " + mList.get(idx));
mProgress.setMax(mPlayer.getDuration());
// mPlayTime.setText(mPlayer.getDuration());
return true;
}
boolean Prepare() {
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
return false;
} catch (IOException e) {
return false;
}
return true;
}
public void mOnClick(View v) {
switch (v.getId()) {
// 재생 및 일시 정지
case R.id.play:
if (mPlayer.isPlaying() == false) {
mPlayer.start();
mPlayBtn.setText("Pause");
} else {
mPlayer.pause();
mPlayBtn.setText("Play");
}
break;
// 재생 정지. 재시작을 위해 미리 준비해 놓는다.
case R.id.stop:
mPlayer.stop();
mPlayBtn.setText("Play");
mProgress.setProgress(0);
Prepare();
break;
case R.id.prev:
case R.id.next:
boolean wasPlaying = mPlayer.isPlaying();
if (v.getId() == R.id.prev) {
mIdx = (mIdx == 0 ? mList.size() - 1:mIdx - 1);
} else {
mIdx = (mIdx == mList.size() - 1 ? 0:mIdx + 1);
}
mPlayer.reset();
LoadMedia(mIdx);
// 이전에 재생중이었으면 다음 곡 바로 재생
if (wasPlaying) {
mPlayer.start();
mPlayBtn.setText("Pause");
}
break;
}
}
// 재생 완료되면 다음곡으로
MediaPlayer.OnCompletionListener mOnComplete =
new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
mIdx = (mIdx == mList.size() - 1 ? 0:mIdx + 1);
mPlayer.reset();
LoadMedia(mIdx);
mPlayer.start();
}
};
///////////////////////////////////////////////////////////////////////////////////
//리스트뷰 아이템 클릭시 재생
public void onListItemClick(ListView l, View v, int position, long id) {
currentPosition = position;
playSong(mIdx + mList.get(position));
}
private void playSong(String mIdx) {
try {
mPlayer.reset();
mPlayer.setDataSource(mIdx);
mPlayer.prepare();
mPlayer.start();
Toast.makeText(this, "재생 : "+mIdx, Toast.LENGTH_LONG).show();
mPlayer.setOnCompletionListener(mOnComplete);
} catch (IOException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
///////////////////////////////////////////////////////////////////////////////////////
// 에러 발생시 메시지 출력
MediaPlayer.OnErrorListener mOnError =
new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
String err = "OnError occured. what = " + what + " ,extra = " + extra;
Toast.makeText(MP3.this, err, Toast.LENGTH_LONG).show();
return false;
}
};
// 위치 이동 완료 처리
MediaPlayer.OnSeekCompleteListener mOnSeekComplete =
new MediaPlayer.OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
if (wasPlaying) {
mPlayer.start();
}
}
};
// 0.2초에 한번꼴로 재생 위치 갱신
Handler mProgressHandler = new Handler() {
public void handleMessage(Message msg) {
if (mPlayer == null) return;
if (mPlayer.isPlaying()) {
mProgress.setProgress(mPlayer.getCurrentPosition());
}
mProgressHandler.sendEmptyMessageDelayed(0,200);
}
};
// 재생 위치 이동
SeekBar.OnSeekBarChangeListener mOnSeek =
new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar,
int progress, boolean fromUser) {
if (fromUser) {
mPlayer.seekTo(progress);
}
}
public void onStartTrackingTouch(SeekBar seekBar) {
wasPlaying = mPlayer.isPlaying();
if (wasPlaying) {
mPlayer.pause();
}
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
SeekBar.OnSeekBarChangeListener mOnSeekv =
new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mAm.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
//반복
CheckBox.OnCheckedChangeListener mOnLoop =
new CheckBox.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
if(isChecked) {
mPlayer.setLooping(true);
} else {
mPlayer.setLooping(false);
}
}
};
}
초보 프로그래머 입니다
간단한 mp3 플레이어를 만들어보고있는데
다른 부분은 대충 다 했는데....
어댑터뷰로 연결시킨 리스트뷰 재생목록을 띄운 후
그 목록을 클릭할 경우 음악이 재생되도록 하려고 하는데요
/////////////////
이부분
///////////////
이 제가 지금 막히는 부분인데
무슨 문제인지 한번 봐주실수 있으신가요 ㅠ