게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
안드로이드> mp3 플레이어 리스트뷰 목록 클릭시 재생 방법...
게시물ID : programmer_6111짧은주소 복사하기
작성자 : 히힝기
추천 : 0
조회수 : 10689회
댓글수 : 6개
등록시간 : 2014/10/21 15:59:01
옵션
  • 베스트금지
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 플레이어를 만들어보고있는데

다른 부분은 대충 다 했는데....

어댑터뷰로 연결시킨 리스트뷰 재생목록을 띄운 후

그 목록을 클릭할 경우 음악이 재생되도록 하려고 하는데요

/////////////////
이부분
///////////////
이 제가 지금 막히는 부분인데

무슨 문제인지 한번 봐주실수 있으신가요 ㅠ
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호