안드로이드 개발 질문/답변
(글 수 45,052)
단말에 있는 3gp 파일을 플레이 하는건데요...
한번 플레이 하고 나서 다음 플레이 하려고 하면 자꾸 오류가 나네욤...
public class SoundPlayer {
private static MediaPlayer mp = new MediaPlayer();
//[플레이]
public void play(final String strFileFullName)
{
try
{
mp.setDataSource(strFileFullName); // mp3파일 경로
mp.prepare(); // 준비
mp.setLooping(false); // 반복재생 false
mp.start(); // 시작
}
catch(IOException e)
{
Log.v(LanguageRecorder.TAG,"SoundPlayer play IOException : "+e.getMessage());
e.printStackTrace();
}
}
//[중지]
public void stop()
{
mp.stop();
//mp.release();
}
}
플레이 중지소스는 위와 같은데요...
10초짜리 파일을 플레이 하게되면...
10초가 되었을때 핸들러를 통해 stop를 호출해서 음악을 종료하게 됩니다...
근데 이상태에서 다시 파일을 플레이 하려고 하니 자꾸 아래와 같은 오류가 나네요...
[오류내용]
10-08 11:46:26.994: ERROR/AndroidRuntime(10991): Uncaught handler: thread main exiting due to uncaught exception
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): java.lang.IllegalStateException
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.media.MediaPlayer.setDataSource(Native Method)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.mgmobile.android.SoundPlayer.play(SoundPlayer.java:30)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.mgmobile.android.LanguageRecorder.onClick(LanguageRecorder.java:482)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.View.performClick(View.java:2370)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.View.onTouchEvent(View.java:4185)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.View.dispatchTouchEvent(View.java:3715)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1700)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1111)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1684)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.view.ViewRoot.handleMessage(ViewRoot.java:1701)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.os.Handler.dispatchMessage(Handler.java:99)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.os.Looper.loop(Looper.java:123)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at android.app.ActivityThread.main(ActivityThread.java:4364)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at java.lang.reflect.Method.invokeNative(Native Method)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at java.lang.reflect.Method.invoke(Method.java:521)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at dalvik.system.NativeStart.main(Native Method)
위의 오류코드에서
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.mgmobile.android.SoundPlayer.play(SoundPlayer.java:30)
부분이 빨간색으로 표시해놓은 부분인데요... 파일 경로는 제대로 받아 오는데 잘 모르겠네요.. ㅠㅠ..
10-08 11:46:27.057: ERROR/AndroidRuntime(10991): at com.mgmobile.android.LanguageRecorder.onClick(LanguageRecorder.java:482)
부분이 본문에서 플레이메서드를 호출하는 부분인데요...
sd.play("파일경로"); 처럼 되어 있습니다...
java.lang.IllegalStateException 이 오류가 왜 나는것인지 도무지 감을 잡을수가 없네요..
아니면 java.lang.IllegalStateException 오류를 찍어볼수 있는 방법은 없을까요???
고수님들의 도움을 부탁드립니다....
그럼.. 즐점하셔욤... ^^
2010.10.08 12:12:25
답변 감사드립니다...
그래도 동일한 오류가 납니다.. ㅠㅠ...
10-08 12:11:49.979: ERROR/AndroidRuntime(11956): java.lang.IllegalStateException
10-08 12:11:49.979: ERROR/AndroidRuntime(11956): at android.media.MediaPlayer.setDataSource(Native Method)
10-08 12:11:49.979: ERROR/AndroidRuntime(11956): at com.mgmobile.android.SoundPlayer.play(SoundPlayer.java:30)
10-08 12:11:49.979: ERROR/AndroidRuntime(11956): at com.mgmobile.android.LanguageRecorder.onClick(LanguageRecorder.java:482)
2010.10.08 12:36:44
저는 버튼을 누르면 플레이하고, 다시 누르면 멈추고하는 식인데요. 이런식으로 만들었습니다.
Cursor c = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null, "title = '" + title + "'", null, null);
c.moveToFirst();
String path = c.getString(c.getColumnIndex("_data"));
mp = MediaPlayerIns.getMusicPlayerIns();
try {
if (!mp.isPlaying()) {
mp.setDataSource(getApplicationContext(), Uri
.parse(path));
mp.prepare();
mp.start();
} else {
mp.stop();
mp.reset();
}
MediaPlayerIns라는 클래스를 새로 만들어서,
항상 동일한 인스턴스를 사용하게 만들었습니다.
import android.media.MediaPlayer;
public class MediaPlayerIns {
private static MediaPlayer mp = null;
public static MediaPlayer getMusicPlayerIns(){
if(mp == null){
mp = new MediaPlayer();
return mp;
} else{
return mp;
}
}
}



