MediaPlayer error -2147483648 al reproducir archivos en almacenamiento interno

Estoy usando la muestra de captura de audio en android.com para grabar y reproducir audio en dispositivos reales. (Touch pad Motorola y Samsung Galaxy S).

Cuando defino la ruta del archivo de audio como

mFile = Environment.getExternalStorageDirectory().getAbsolutePath(); 

Grabación y reproducción.

Pero si configuro el archivo de audio como

 mFile = getFilesDir().getAbsolutePath(); 

O

 mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath(); 

O

 mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath(); 

Parece funcionar, pero la reproducción falla

ERROR / MediaPlayer (4559): error (1, -2147483648)

¿Qué función devolverá el directorio de almacenamiento interno correcto para guardar archivos de audio para su reproducción sólo en mi aplicación ?

El código en cuestión está en mi función onCreate . (En el ejemplo, lo tienen en el Constructor, pero lo moví a onCreate porque de lo contrario getFilesDir () y getDir () no tienen contexto para trabajar.)

 public void onCreate(Bundle icicle) { super.onCreate(icicle); // mFile = Environment.getExternalStorageDirectory().getAbsolutePath(); // OK // mFile = getFilesDir().getAbsolutePath(); // BAD // mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath(); // BAD mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath(); // BAD mFile += "/audiorecordtest.3gp"; Log.e(LOG_TAG,mFile); // ... } 

Cuando grabo en el almacenamiento externo (y la reproducción funciona correctamente), el registro se ve así:

 06-17 10:07:30.890: DEBUG/AudioHardwareTegra(85): getInputBufferSize: returns 320 for rate 8000 06-17 10:07:30.900: INFO/MPEG4Writer(85): limits: 2147483647/0 bytes/us, bit rate: 12200 bps and the estimated moov size 3072 bytes 06-17 10:07:30.960: DEBUG/AudioHardwareTegra(85): setDriver_l: Analog mic? yes. Bluetooth? no. 06-17 10:07:31.100: WARN/AudioFlinger(85): RecordThread: buffer overflow 06-17 10:07:31.100: INFO/MPEG4Writer(85): setStartTimestampUs: 86380 06-17 10:07:31.100: INFO/MPEG4Writer(85): Earliest track starting time: 86380 06-17 10:07:34.350: DEBUG/MPEG4Writer(85): Stopping Audio track 06-17 10:07:34.450: INFO/MPEG4Writer(85): Received total/0-length (167/0) buffers and encoded 167 frames. - audio 06-17 10:07:34.450: INFO/MPEG4Writer(85): Audio track drift time: -20309 us 06-17 10:07:34.450: DEBUG/MPEG4Writer(85): Stopping Audio track source 06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Audio track stopped 06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Stopping writer thread 06-17 10:07:34.470: DEBUG/MPEG4Writer(85): 0 chunks are written in the last batch 06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Writer thread stopped 06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Stopping Audio track 06-17 10:07:34.470: WARN/MediaRecorder(4472): mediarecorder went away with unhandled events 06-17 10:07:40.310: INFO/StagefrightPlayer(85): setDataSource('/mnt/sdcard/audiorecordtest.3gp') 06-17 10:07:46.590: DEBUG/AudioHardwareTegra(85): AudioStreamOutTegra::flush() 06-17 10:07:46.670: DEBUG/AudioHardwareTegra(85): AudioStreamOutTegra::flush() returns 

Cuando grabo en el almacenamiento interno (y falla), el registro tiene este aspecto:

 06-17 10:08:28.380: DEBUG/AudioHardwareTegra(85): getInputBufferSize: returns 320 for rate 8000 06-17 10:08:28.380: INFO/MPEG4Writer(85): limits: 2147483647/0 bytes/us, bit rate: 12200 bps and the estimated moov size 3072 bytes 06-17 10:08:28.440: DEBUG/AudioHardwareTegra(85): setDriver_l: Analog mic? yes. Bluetooth? no. 06-17 10:08:28.970: WARN/AudioFlinger(85): RecordThread: buffer overflow 06-17 10:08:28.970: INFO/MPEG4Writer(85): setStartTimestampUs: 83095 06-17 10:08:28.970: INFO/MPEG4Writer(85): Earliest track starting time: 83095 06-17 10:08:34.020: DEBUG/MPEG4Writer(85): Stopping Audio track 06-17 10:08:34.080: WARN/AudioFlinger(85): RecordThread: buffer overflow 06-17 10:08:34.090: INFO/MPEG4Writer(85): Received total/0-length (257/0) buffers and encoded 257 frames. - audio 06-17 10:08:34.090: INFO/MPEG4Writer(85): Audio track drift time: -385311 us 06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping Audio track source 06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Audio track stopped 06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping writer thread 06-17 10:08:34.090: DEBUG/MPEG4Writer(85): 0 chunks are written in the last batch 06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Writer thread stopped 06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping Audio track 06-17 10:08:34.100: WARN/MediaRecorder(4559): mediarecorder went away with unhandled events 06-17 10:08:40.740: INFO/StagefrightPlayer(85): setDataSource('/data/data/my.record.test/files/audiorecordtest.3gp') 06-17 10:08:40.740: ERROR/MediaPlayer(4559): error (1, -2147483648) 06-17 10:08:40.740: ERROR/AudioRecordTest(4559): prepare() failed 

Las secciones de grabación del registro parecen en gran medida iguales para mí, así que creo que es la grabación, pero no sé cómo comprobar el archivo de ninguna manera además de jugarlo. D

El registro de errores es similar cuando uso getDir ().

Gracias a gtkandroid :

En lugar de mPlayer.setDataSource(mFile); Hice esto:

 FileInputStream fileInputStream = new FileInputStream(mFile); mPlayer.setDataSource(fileInputStream.getFD()); fileInputStream.close(); mPlayer.prepare(); 

Tim Crowley tiene razón. Una mejor práctica es cerrar la corriente, como esto:

 FileInputStream stream = new FileInputStream(path); mediaPlayer.setDataSource(stream.getFD()); stream.close(); 

Se observa en la documentación del método:

android.media.MediaPlayer.setDataSource(FileDescriptor fd)

Establece el origen de datos ( FileDescriptor ) a utilizar. Es responsabilidad de la persona que llama a cerrar el descriptor de archivo. Es seguro hacerlo tan pronto como regrese esta llamada .

  • ¿Por qué mediaPlayer.seekTo (msec) no actualiza surfaceView cuando mediaPlayer está pausado?
  • Android: Cómo detener el servicio de música de mi aplicación, si otra aplicación reproduce música.
  • Android media player - cómo deshabilitar la gama de solicitud? (Rotura de audio roto en Nexus 7)
  • Android MediaPlayer Detener y reproducir
  • Cómo adjuntar MediaPlayer con SurfaceView en android?
  • Cómo reproducir audio en segundo plano en segundo plano en Android?
  • RTP en Android MediaPlayer
  • ANR android en MediaPlayer restablecer
  • Android: reproductor nativo con subtítulos
  • Android2.x: Código de error de MediaPlayer (1, -19)
  • ¿Cómo continúan los reproductores de medios de Android la reproducción de canciones cuando se cierra la aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.