마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

mp3 플레이어 리스트뷰 클릭시 재생방법좀... [closed]

0 추천
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);
			}
		}
	};
	
}

완전 생 초보 프로그래머입니다

지금 엠피3플레이어 간단한 구조로 만드는중인데

다른건 다 괜찮은데

 

/////////////////////////////

이렇게 해놓은 부분

///////////////////////////////

이 안되더라구요

 

어댑터뷰로 연결해서 그 리스트를 받아서 클릭이벤트를 발생시켰다고 생각했는데

오류도 나지 않고 며칠째 이걸로 고민하다 질문드립니다

어디가 문제인지 좀 알려주시면 감사하겠습니다 ㅠ

질문을 종료한 이유: 해결햇슴다
점프점프캥거루 (200 포인트) 님이 2014년 10월 21일 질문
점프점프캥거루님이 2014년 10월 23일 closed
...