2013-07-30 2 views
1

간단한 응용 프로그램을 만들려고합니다. 즉, imagebutton을 만지기 만하면 오디오를 녹음합니다.오디오를 녹음하려고 할 때 응용 프로그램이 작동을 멈 춥니 다.

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //PREPARE MEDIA RECORDER 
    final MediaRecorder recorder = new MediaRecorder(); 
    recorder.reset(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile("/easyvoicenotepad/test.mp3"); 

    //PREPARE 
    try { 
     recorder.prepare(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //IMAGE BUTTON 
    final ImageButton recBtn = (ImageButton) findViewById(R.id.recButton); 
    recBtn.setOnTouchListener(new OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       recBtn.setImageResource(R.drawable.record_btn_pressed); 
       recorder.start(); 
      } 
      else if(event.getAction() == MotionEvent.ACTION_UP) { 
       recBtn.setImageResource(R.drawable.record_btn); 
       recorder.stop(); 
       recorder.release(); 
      } 

      return false; 
     } 
    }); 
} 

편집 로그 캣 파일 :

07-30 13:53:09.423: E/MediaRecorder(10586): start called in an invalid state: 4 
07-30 13:53:09.423: E/InputEventReceiver(10586): Exception dispatching input event. 
07-30 13:53:09.423: E/MessageQueue-JNI(10586): Exception in MessageQueue callback: handleReceiveCallback 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): java.lang.IllegalStateException 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.media.MediaRecorder.start(Native Method) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at com.whizzappseasyvoicenotepad.MainActivity$1.onTouch(MainActivity.java:48) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.View.dispatchTouchEvent(View.java:7379) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.app.Activity.dispatchTouchEvent(Activity.java:2424) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.View.dispatchPointerEvent(View.java:7564) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at  android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.os.MessageQueue.nativePollOnce(Native Method) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.os.MessageQueue.next(MessageQueue.java:132) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.os.Looper.loop(Looper.java:124) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at android.app.ActivityThread.main(ActivityThread.java:5103) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at java.lang.reflect.Method.invokeNative(Native Method) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at java.lang.reflect.Method.invoke(Method.java:525) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-30 13:53:09.431: E/MessageQueue-JNI(10586): at dalvik.system.NativeStart.main(Native Method) 
07-30 13:53:09.438: E/AndroidRuntime(10586): FATAL EXCEPTION: main 
07-30 13:53:09.438: E/AndroidRuntime(10586): java.lang.IllegalStateException 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.media.MediaRecorder.start(Native Method) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at com.whizzappseasyvoicenotepad.MainActivity$1.onTouch(MainActivity.java:48) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.View.dispatchTouchEvent(View.java:7379) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1910) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.app.Activity.dispatchTouchEvent(Activity.java:2424) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.View.dispatchPointerEvent(View.java:7564) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.os.MessageQueue.nativePollOnce(Native Method) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.os.MessageQueue.next(MessageQueue.java:132) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.os.Looper.loop(Looper.java:124) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at android.app.ActivityThread.main(ActivityThread.java:5103) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at java.lang.reflect.Method.invokeNative(Native Method) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at java.lang.reflect.Method.invoke(Method.java:525) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-30 13:53:09.438: E/AndroidRuntime(10586): at dalvik.system.NativeStart.main(Native Method) 

문제는 내가 오디오 레코더 기능을 추가 한 후 앱이 최대한 빨리 컴파일로 충돌이다 이것은 코드입니다.

나는 지금 내 응용 프로그램 충돌 즉시 나는하여 ImageButton이

+1

'Manifest'에는'use-permission android : name = "android.permission.RECORD_AUDIO"/>'가 있습니까? – g00dy

+0

''는 어떨까요? – g00dy

+0

실제로 여기에 로그인 한 공식 버그가 발견되었습니다. https://code.google.com/p/android/issues/detail?id=5063 – g00dy

답변

1

의 AndroidManifest.xml 파일에 AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
+1

고맙습니다. 문제가 있습니다. 권한을 설정하는 것을 잊어 버렸습니다. 하지만 내 응용 프로그램은 여전히 ​​충돌합니다. 지금 실행하면 이미지 버튼을 터치하자마자 충돌이 발생합니다. 어떤 아이디어가 여전히 문제가 될 수 있습니까? – Guy

+0

@Matthew logcat 그게 뭐죠? 즉. 예외 이름? –

+0

logcat 파일을 편집했습니다. 확인하십시오. – Guy

0

추가 권한 내에서 permission 추가를 터치로, 권한을 설정이

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
0

레코더 객체를 최종적으로 최종 MediaRecorder 레코더로 선언했습니다. = new MediaRecorder();

final은 코드를 사용하여 상수 및 상수 멤버를 업데이트 할 수 없음을 의미합니다. 정적이거나 사적인 것으로 해보십시오. 최종적인 것이 아닌 다른 의미입니다.

개인 MediaRecorder 레코더 = new MediaRecorder();

+0

나는 정적이 아닌 다른 어떤 것도 만들 수 없습니다. 그것은 생성 안쪽에 있습니다 – Guy

+0

안녕하세요, 귀하의 코드는 괜찮아요, 당신은 안드로이드 매니 페스트 파일에 쓰기 권한을 외부 저장소를 선언했습니다 -

+0

여전히 충돌이 발생하면 외장 스토리지에 대한 경로 하나만 생각하면됩니다.
try -'mFileName = Environment.getExternalStorageDirectory(). getAbsolutePath();
mFileName + ="/ easyvoicenotepad/test.mp3 "; '
을 입력 한 다음 mFileName을 setOutputFile에
으로 전달하십시오. recorder.setOutputFile (mFileName);' –

1

아래의 주석에 따라 onTouchonCreate()으로부터 격리되도록 전체 코드를 변경하십시오. 다음과 같아야합니다 :

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     recBtn.setImageResource(R.drawable.record_btn_pressed); 
     recorder.start(); 
     return true; 
    } 
    else if(event.getAction() == MotionEvent.ACTION_UP) { 
     recBtn.setImageResource(R.drawable.record_btn); 
     recorder.stop(); 
     recorder.reset(); 
     recorder.release(); 
     recorder = null; 
    } 

return true; 
} 
+0

전체 코드가 어떻게 작성 외부에 표시되는지 예를 들어 주시겠습니까? 이 문제를 해결하기 위해 몇 가지 문제가 있습니다 :/ – Guy

+1

대답은 이미 받아 들여졌지만 쉽게 할 수 있습니다. 단지 onTouchEvent()가 그들을보고 조작 할 수 있도록 레코더와 recBtn을 공개적으로 볼 수있게 만드십시오. 마지막 이미지 버튼 recBtn = (ImageButton) findViewById (R.id.recButton);'onTouchEvent()에서 reco rder를 공개해야하는 경우 "// IMAGE BUTTON"주석 아래의 모든 코드를 제거하십시오. – g00dy

+0

대단히 감사합니다. – Guy

관련 문제