7

我搜索了很多主题,但没有直接的答案。MediaRecorder启动时崩溃

我有这样的代码:

 recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

    recorder.setOutputFile(mFileName); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    if(!mStartRecording) 
    { 
     btn.setText("Stop Recording"); 
     try { 
      recorder.prepare(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     recorder.start(); 
     mStartRecording = true; 
    } 
    else 
    { 
     btn.setText("Start Recording"); 
     mStartRecording = false; 
     recorder.stop(); 
     recorder.reset(); 
     recorder.release(); 

     recorder = null; 
    } 

而且我补充说:

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

(见的地方,添加存储解决它,不适合我)

我在API级别7(Android 2.1)上开发

堆栈跟踪显示“启动显示” 堆栈轨迹:

04-26 19:27:41.955: D/dalvikvm(890): GC freed 809 objects/58272 bytes in 433ms 
04-26 19:27:44.772: D/dalvikvm(890): GC freed 95 objects/3936 bytes in 371ms 
04-26 19:28:54.973: E/MediaRecorder(890): start failed: -1 
04-26 19:28:54.993: D/AndroidRuntime(890): Shutting down VM 
04-26 19:28:54.993: W/dalvikvm(890): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
04-26 19:28:54.993: E/AndroidRuntime(890): Uncaught handler: thread main exiting due to uncaught exception 
04-26 19:28:55.105: E/AndroidRuntime(890): java.lang.IllegalStateException: Could not execute method of the activity 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View$1.onClick(View.java:2031) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View.performClick(View.java:2364) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View.onTouchEvent(View.java:4179) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.widget.TextView.onTouchEvent(TextView.java:6541) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View.dispatchTouchEvent(View.java:3709) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.os.Looper.loop(Looper.java:123) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invokeNative(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invoke(Method.java:521) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-26 19:28:55.105: E/AndroidRuntime(890): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-26 19:28:55.105: E/AndroidRuntime(890): at dalvik.system.NativeStart.main(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): Caused by: java.lang.reflect.InvocationTargetException 
04-26 19:28:55.105: E/AndroidRuntime(890): at shibby.whisper.WhisperGameActivity.recordAudio(WhisperGameActivity.java:94) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invokeNative(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): at java.lang.reflect.Method.invoke(Method.java:521) 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.view.View$1.onClick(View.java:2026) 
04-26 19:28:55.105: E/AndroidRuntime(890): ... 21 more 
04-26 19:28:55.105: E/AndroidRuntime(890): Caused by: java.lang.RuntimeException: start failed. 
04-26 19:28:55.105: E/AndroidRuntime(890): at android.media.MediaRecorder.start(Native Method) 
04-26 19:28:55.105: E/AndroidRuntime(890): ... 25 more 
04-26 19:28:55.223: I/dalvikvm(890): threadid=7: reacting to signal 3 
04-26 19:28:55.335: I/dalvikvm(890): Wrote stack trace to '/data/anr/traces.txt' 
04-26 19:28:57.123: I/Process(890): Sending signal. PID: 890 SIG: 9 

请帮忙。

+0

提供所有的堆栈跟踪请 – Snicolas 2012-04-26 19:51:34

+0

@Snicolas提供。 – 2012-04-26 19:53:59

+0

你能在/data/anr/traces.txt找到什么 – Snicolas 2012-04-26 19:56:22

回答

3

好吧,我知道了。我想你已经将mStartRecording初始化为true。

因此,您的if正在进入else区块。其中,您停止了一个全新的MediaRecorder实例,并且状态图不允许这样做。

让您的媒体记录器成为您班级的一个领域。并正确地初始化你的mStartRecording布尔变量为false。仅当您的字段为空时,请重新设置媒体记录器。

if(recorder == null) { 
    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

    recorder.setOutputFile(mFileName); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
}//if 
if(!mStartRecording) { 
    btn.setText("Stop Recording"); 
    try { 
     recorder.prepare(); 
     recorder.start(); 
     mStartRecording = true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }//catch 
} else { 
    btn.setText("Start Recording"); 
    mStartRecording = false; 
    recorder.stop(); 
    recorder.reset(); 
    recorder.release(); 
    recorder = null; 
}//else 
+0

对不起,我没有提到,我认为这是一个给定的。 mStartRecording是错误的。 – 2012-04-26 20:09:00

+0

试试吧。它仍然是一个更好的方式来编码 – Snicolas 2012-04-26 20:14:30

+1

我试过了,还是一样的错误。 – 2012-04-26 20:17:33

2

尝试将start功能放在与prepare功能相同的功能块中。也许有一个异常阻塞从执行准备并直接启动,从而导致IllegalStateException

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(output_formats[currentFormat]); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile(getFilename()); 


    try { 
     recorder.prepare(); 
     recorder.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

开始时就像那样,仍然没有工作。 – 2012-04-26 20:01:47

+0

完全相同的跟踪... – 2012-04-26 20:05:48

+0

是setaudioencoder之后的setoutputfile吗?尝试改变它! – 2012-04-26 20:13:11

0

尝试启动录音机,只有当它准备:

try { 
     recorder.prepare(); 
     recorder.start(); 
     mStartRecording = true; 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "Error when preparing or starting recorder", e); 
    } 
+0

我做到了。仍然没有工作... – 2012-04-26 20:03:49

1

我用下面的代码,完全适用于我..

protected void startRecording() { 
    // TODO Auto-generated method stub 
    i++; 
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    mFileName += "/audiorecordtest"+i+".3gp"; 
    recorder = new MediaRecorder(); 

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setOutputFile(mFileName); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

     try { 
     recorder.prepare(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "IllegalStateException called", Toast.LENGTH_LONG).show(); 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "prepare() failed", Toast.LENGTH_LONG).show(); 

    } 

     recorder.start(); 
} 

private void stopRecording() { 
    recorder.stop(); 
    recorder.release(); 
    recorder = null; 
    } 
0

这些方法必须安排它的运行顺序。这里:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
recorder.setOutputFile(mFileName); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
0

我有同样的问题。这是因为我在设置录制音频的文件名时错过了斜线。

变化

this.fileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
this.fileName += "yourfilename.3gp"; 

this.fileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
this.fileName += "/yourfilename.3gp"; 
0

我,因为我的SurfaceView的同样的问题已不可见。所以使它可见

mSurfaceView.setVisibility(View.VISIBLE);