Android Mediaplayer: problema de setDataSource para el archivo de medios descargado

Tengo una aplicación que grabar y reproducir archivos de audio. Algunos de los archivos de audio se descargan usando descargas estándar http simples usando httpclient. Funcionó como un encanto durante mucho tiempo. Ahora de repente no puedo reproducir los archivos que descargo. No funciona con esta pila. Guardo los archivos en la tarjeta SD y encuentro el problema tanto en un teléfono como en un dispositivo USB conectado.

He comprobado que el archivo descargado es genial en el servidor, y puedo reproducirlo sin ningún problema.

Estos son los fragmentos de código que utilizo (sé que recordingFile es una ruta válida para el archivo).

// inside the activity class private void playRecording() throws IOException{ File recordingFile = new File(recordingFileName); FileInputStream recordingInputStream = new FileInputStream(recordingFile); audioMediaPlayer.playAudio(recordingInputStream); } 

Aquí está el código del reproductor multimedia:

  // inside my media player class which handles the recordings public void playAudio(FileInputStream audioInputStream) throws IOException { mediaPlayer.reset(); mediaPlayer.setDataSource(audioInputStream.getFD()); mediaPlayer.prepare(); mediaPlayer.start(); } 

Aquí está la excepción:

 E/MediaPlayerService( 555): offset error E/MediaPlayer( 786): Unable to to create media player W/System.err( 786): java.io.IOException: setDataSourceFD failed.: status=0x80000000 W/System.err( 786): at android.media.MediaPlayer.setDataSource(Native Method) W/System.err( 786): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:632) W/System.err( 786): at net.xxx.xxx.AudioMediaPlayer.playAudio(AudioMediaPlayer.java:69) W/System.err( 786): at net.xxx.xxx.Downloads.playRecording(Downloads.java:299) W/System.err( 786): at net.xxx.xxx.Downloads.access$0(Downloads.java:294) W/System.err( 786): at net.xxx.xxx.Downloads$1.onClick(Downloads.java:135) 

He tratado de buscar alguna respuesta del error de compensación, pero no realmente claro lo que este problema podría ser.

PS I descargar el archivo con este código:

  public FileOutputStream executeHttpGet(FileOutputStream fileOutputStream) throws ClientProtocolException, IOException{ try { // Execute HTTP Post Request httpResponse = httpClient.execute(httpPost, localContext); int status = httpResponse.getStatusLine().getStatusCode(); // we assume that the response body contains the error message if (status != HttpStatus.SC_OK) { ByteArrayOutputStream ostream = new ByteArrayOutputStream(); httpResponse.getEntity().writeTo(ostream); fileOutputStream = null; } else { InputStream content = httpResponse.getEntity().getContent(); byte[] buffer = new byte[1024]; int len = 0; while ( (len = content.read(buffer)) > 0 ) { fileOutputStream.write(buffer,0, len); } fileOutputStream.close(); content.close(); // this will also close the connection } } catch (ClientProtocolException e1) { // TODO Auto-generated catch block e1.printStackTrace(); fileOutputStream = null; } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); fileOutputStream = null; } return fileOutputStream; } 

Lo solucioné por mi cuenta. Como he puesto mi comentario por encima de la solución fue la siguiente:

Cuando refactored parte del código hice un error tipográfico en un código hash que uso para permitir descargas y no. Desafortunadamente no tuve la captura apropiada cuando descargé el archivo obligando al archivo a estar vacío. Básicamente, enviar un encabezado de solicitud incorrecta si intenta recuperar un archivo sin un código de activación adecuado.

El culpable estaba aquí:

  if (status != HttpStatus.SC_OK) { ByteArrayOutputStream ostream = new ByteArrayOutputStream(); httpResponse.getEntity().writeTo(ostream); fileOutputStream = null; } else { InputStream content = httpResponse.getEntity().getContent(); byte[] buffer = new byte[1024]; int len = 0; while ( (len = content.read(buffer)) > 0 ) { fileOutputStream.write(buffer,0, len); } fileOutputStream.close(); content.close(); // this will also close the connection } 

Para los casos en los que el código de estado regresó como malo (es decir, el encabezado de solicitud incorrecta para los accesos bloqueados). Lo que me faltó fue capturar el caso de un puntero nulo allí y que causó una entrada de SQLite para actualizar alegando a la aplicación que la descarga fue un éxito, pero no lo fue.

Lección aprendida: Siempre ponga los cheques nulos para estos casos, incluso para los prototipos. Todos los derechos reservados

Primero, asegúrese de que su dispositivo no esté montado. Ya sea Android o el PC host puede acceder a la tarjeta SD, pero no ambos simultáneamente.

En segundo lugar, no está claro por qué está utilizando un FileInputStream y getFD() . Simplemente pasa la ruta al archivo de la tarjeta SD al MediaPlayer (por ejemplo, new File(Environment.getExternalStorageDirectory(), "yourfile.mp3") ) y deja que el jugador abra el archivo.

  • Mostrar toda la música en la tarjeta SD
  • Obtener stringXmlContent y escribir a continuación, guardado en el archivo .xml almacenado en sdcard en android ¿cómo se puede?
  • creando un drawable de la tarjeta del SD para fijar como fondo en android
  • Sistema de archivos de la tarjeta SD de Android
  • Transmita la salida logcat de android a una tarjeta sd
  • Android: cómo escuchar "tarjeta sd eliminada inesperadamente"
  • Android: Guardar archivos en la tarjeta SD
  • ¿Establecer ubicación de instalación para Android 1.6?
  • SQLiteOpenHelper - crear base de datos en tarjeta SD
  • ¿Existe un límite para el número de archivos en un directorio de una tarjeta SD?
  • Ruta de archivo SDCard externa para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.