2013-07-30 86 views
1

因此,我试图制作一个简单的应用程序,只要按住图像按钮即可记录音频。这是代码:尝试录制音频时,应用程序崩溃

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; 
     } 
    }); 
} 

编辑logcat的文件:

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'中有''>吗? – g00dy

+0

<使用权限android:name =“android.permission.WRITE_EXTERNAL_STORAGE”/>'? – g00dy

+0

我实际上发现了一个官方bug在这里登录:https://code.google.com/p/android/issues/detail?id = 5063 – g00dy

回答

1

添加permissionAndroidManifest.xml

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

谢谢,那是问题所在,我忘了设置权限。但我的应用程序仍然崩溃。立即执行,只要我触摸图像按钮就会崩溃。任何想法仍然是什么问题? – Guy

+0

@Matthew logcat的呢?即。异常名称? –

+0

我编辑了logcat文件,请检查它 – Guy

0

添加权限到AndroidManifest.xml文件,

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

你已经宣布录音机对象最终在 - 最终MediaRecorder记录器=新的MediaRecorder();

final表示常量,常量成员不能用代码更新。 所以尽量让它静态或私人,我的意思是除了最终。

private MediaRecorder recorder = new MediaRecorder();

+0

我不能让它成为静态以外的东西,因为它在创建内 – Guy

+0

嗨,你的代码看起来不错,你有没有在Android清单文件中声明外部存储器写入权限 - <使用权限android:name =“android.permission。WRITE_EXTERNAL_STORAGE“/> –

+0

如果它仍然崩溃,那么我只能想到一件事,即外部存储的路径
尝试 - '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

你能给我一个例子,说明整个代码看起来像是在oncreate之外吗?我仍然习惯了所有的所以我有这样做的一些问题:/ – Guy

+1

即使答案已被接受 - 这很容易,只需使记录器和recBtn公开可见,以便“onTouchEvent()”可以看到并操纵它们。 '最终ImageButton recBtn =(ImageButton)findViewById(R.id.recButton);'在'onTouchEvent()'中,必须公开,删除评论“//图像按钮”下面的所有代码。 – g00dy

+0

非常感谢你:) – Guy

相关问题