Uso de MediaPlayer para reproducir un archivo AMR creado por MediaRecorder falla con muri null

Estoy escribiendo una aplicación que graba voz desde el micrófono en formato AMR usando MediaRecorder, y luego reproduce los datos utilizando MediaPlayer.

Esa es la meta de todos modos.

Estoy bastante seguro de mi lado MediaRecorder está trabajando, estoy produciendo el archivo de datos en el lugar correcto a la velocidad de datos correcta. Aquí es cómo comienzo y para mi MediaRecorder

public void OnStartRecord(View v ) { System.out.println( "StartRecord"); try { audioFile = File.createTempFile("amrtmp", ".amr", getApplicationContext().getFilesDir()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println( "Recording to " + audioFile.getAbsolutePath()); mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mRecorder.setAudioEncodingBitRate(4750); mRecorder.setAudioSamplingRate(8000); mRecorder.setOutputFile(audioFile.getAbsolutePath()); try { mRecorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mRecorder.start(); } public void OnStopRecord(View v ) { System.out.println( "StopRecord"); mRecorder.stop(); mRecorder.release(); } 

Esto funciona como un encanto. La salida típica es algo como

 StartRecord Recording to /data/data/com.test.playback/files/amrtmp-235967797.amr 

Y cuando empiezo, luego dejo de grabar, puedo ver que el archivo ha sido creado y tiene una cierta cantidad de datos en él que corresponde correctamente a los ajustes.

Nota lateral: detecto un zumbido extraño en mi altavoz mientras que esto funciona. ¿Alguna idea de lo que es?

Cuando trato de reproducir el archivo de nuevo sin embargo no tengo ningún problema final. He intentado lo siguiente:

 public void OnPlay(View v ) { MediaPlayer mPlayer = new MediaPlayer(); mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); FileInputStream FIS = null; try { FIS = new FileInputStream(audioFile.getAbsolutePath()); mPlayer.setDataSource(FIS.getFD()); mPlayer.prepare(); } catch( Exception e ) { e.printStackTrace(); } mPlayer.start(); } 

Esto hace que nada se reproduzca en absoluto con la siguiente salida de MediaPlayer:

Start () mURI es nulo

También he probado el mismo código, pero la configuración de la fuente de datos de mPlayer de manera diferente:

 mPlayer.setDataSource(audioFile.getAbsolutePath()); 

Esto falla cuando prepare se llama con un estado java.io.IOException 0x1.

Tengo que imaginar que hay algo más que necesito hacer con MediaPlayer para configurarlo correctamente. ¿Alguna sugerencia?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.