7

he buscado muchos temas, pero no tengo una respuesta directa.MediaRecorder se bloquea al iniciar

tengo este código:

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

Y he añadido:

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

(vio en alguna parte que añadir almacenamiento resolvió, no es bueno para mí)

estoy desarrollando en API nivel 7 (Android 2.1)

stack trace dice "start faild" Stack trace:

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 

Por favor ayuda.

+0

proporciona toda la pila de trazas por favor – Snicolas

+0

@Snicolas Provisto. –

+0

qué puede encontrar en /data/anr/traces.txt – Snicolas

Respuesta

3

Ok, lo tengo. Supongo que has inicializado mStartRecording en true.

Por lo tanto, su if va al bloque else. En él, detiene una nueva instancia de MediaRecorder y el diagrama de estado no lo permite.

Haga de su grabador de medios un campo de su clase. Y inicialice correctamente su variable booleana mStartRecording a falso. Vuelva a configurar su grabador de medios solo si su campo es nulo.

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

Lo siento, no lo mencioné, pensé que era un hecho. mStartRecording es falso. –

+0

pruébalo. Todavía es una mejor manera de tenerlo codificado – Snicolas

+1

Lo intenté, igual error. –

2

Intente poner la función start en el mismo bloque que la función prepare. tal vez haya una excepción bloqueando prepararse desde la ejecución y vaya directamente a comenzar causando un 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

Fue así al principio, todavía no funcionaba. –

+0

Exacto mismo rastro ... –

+0

¿es su archivo setoutput después de setaudioencoder? intenta cambiar eso! –

0

intenta iniciar el grabador sólo cuando se prepara:

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

lo hice. todavía no funciona ... –

1

estoy usando el siguiente código, funciona perfectamente para mí ..

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

Estos métodos deben organizar el orden que se ejecutará. Aquí:

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

Tuve el mismo problema. Esto se debe a que había perdido una barra mientras establecía el nombre de archivo para el audio grabado.

cambio

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

a

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

que tenía el mismo problema debido a mi SurfaceView se ha hecho invisible. Por lo tanto, hazlo visible

mSurfaceView.setVisibility(View.VISIBLE); 
Cuestiones relacionadas