Programming/Android
[android] 내/외부 미디어파일 DB에서 미디어파일가져와서 재생하기
커널제로
2011. 12. 1. 10:29
나는 간단한 알림 사운드를 구현하기 위해 soundpool을 이용하였는데.
만약 mp3같은 길이가 긴 재생파일이라면 media player를 이용하면 된다.
http://blog.naver.com/PostView.nhn?blogId=anwun&logNo=140351028 를 참조하면 컨셉을 잡을 수 있다.
애를 먹었던 점이 db에 저장된 미디어파일의 path를 가져오는 건데..
query를 잘모르는 나는 (OCP를 가지고 있음에도;;;) 상당히 애를 먹었다.
그도 그럴것이 인터넷 예제는 죄다 로컬파일을 업로드하여 path를 이미 알고 있는
하드코딩된 path를 이용하고 있었고
구글 검색으로 찾은 해외의 사이트들 (stackoverflow.com을 주로)에도 이러한 예제는 없었다.
아 물론 질문자는 있었는데; 답변이없는 경우였다.
암튼 각설하고 소스코드를 적어놓으니 필요한사람은 보길 바라는 맘으로 적어둔다.
나의 경우에는 리스트뷰에서 아이템을 선택하면 소리가 한번 재생되는 소스이다.(벨소리선택)
만약 mp3같은 길이가 긴 재생파일이라면 media player를 이용하면 된다.
http://blog.naver.com/PostView.nhn?blogId=anwun&logNo=140351028 를 참조하면 컨셉을 잡을 수 있다.
애를 먹었던 점이 db에 저장된 미디어파일의 path를 가져오는 건데..
query를 잘모르는 나는 (OCP를 가지고 있음에도;;;) 상당히 애를 먹었다.
그도 그럴것이 인터넷 예제는 죄다 로컬파일을 업로드하여 path를 이미 알고 있는
하드코딩된 path를 이용하고 있었고
구글 검색으로 찾은 해외의 사이트들 (stackoverflow.com을 주로)에도 이러한 예제는 없었다.
아 물론 질문자는 있었는데; 답변이없는 경우였다.
암튼 각설하고 소스코드를 적어놓으니 필요한사람은 보길 바라는 맘으로 적어둔다.
나의 경우에는 리스트뷰에서 아이템을 선택하면 소리가 한번 재생되는 소스이다.(벨소리선택)
public void onListItemClick(ListView list, View view, int position, long id) {
//포지션값 변수에 저장
Log.w("position -onListItemClick",String.valueOf(position));
m_intSelectedItem = position;
String[] cursorColumns = new String[] {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA
};
Cursor cursor = (Cursor) getContentResolver().query(
MediaStore.Audio.Media.INTERNAL_CONTENT_URI, //내장메모리
// MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, //외장메모리
cursorColumns, null, null, null);
if (cursor == null) {
Toast.makeText(this, "null", Toast.LENGTH_LONG).show();
}
int intDataColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
cursor.moveToPosition(position);
m_strDataColumn= cursor.getString(intDataColumn);
Log.w("asdfasdf",m_strDataColumn);
//선택된 소리 재생.////////////////////////////////////////////////////////
// 사운드풀 생성하기
// ** parameters **
// 1: 동시출력 가능 스트림수
// 2: AudioManager에 정의된 스트림 타입
// 3: sample rate 컨버터의 품질. default로 0을 줌
SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
// 사운드풀 로드하기
//int intSoundCorrect = sp.load(, 1);
int intSoundCorrect = sp.load(m_strDataColumn, 1);
// 미디어 재생하기
// ** parameters **
// 1: 리소스 식별
// 2-3: 소리크기
// 4: 우선순위
// 5: 파라미터 반복정보(0==반복안함, 1==1번반복(총2번), -1==무한반복)
// 6: 재생속도(1==1x, 2==2x)
// sp.play(intSoundCorrect, 1.0f, 1.0f, 0, 0, 1.0f);
int waitLimit = 1000;
int waitCounter = 0;
int throttle = 10;
while(sp.play(intSoundCorrect, 1.f, 1.f, 1, 0, 1.f) == 0 && waitCounter < waitLimit){
waitCounter++; SystemClock.sleep(throttle);
}
}