2012-06-16 8 views
6

Ich brauche deine Hilfe. Ich habe versucht, eine im Ordner "Assets" gespeicherte Audiodatei abzuspielen. Es ist jedoch ein Fehler aufgetreten.Android Media Player Fehler (1, -4) während der Wiedergabe eines Audio aus Assets Ordner

Hier mein Code sind:

try{ 
    if (player.isPlaying()) { 
    player.stop(); 
    player.release(); 
    } 
}catch(Exception e){ 
    Toast.makeText(this, "an exception occurred", Toast.LENGTH_LONG).show(); 
    e.printStackTrace(); 
} 
try{ 
    AssetFileDescriptor afd = BeeDailyConvo.this.getAssets().openFd("sounds/hello_kr.wma"); 
    player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
    player.prepare(); 
    player.start(); 
}catch(Exception e){ 
    e.printStackTrace(); 
} 

Und hier sind meine logcat:

06-16 22: 39: 53,330: W/Mediaplayer (13490): info/Warnung (1, 26)
06-16 22: 39: 53,330: E/Mediaplayer (13490): Fehler (1, -4)

Könnten Sie bitte erklären, was mit meinem Code falsch?

Vielen Dank im Voraus

Grüße,

Priska

Antwort

4

Dieses Problem wurde behoben.

Der Asset-Dateideskriptor muss vor der Vorbereitung des Players geschlossen werden.Dies ist, wie ich das Problem gelöst:

player = new MediaPlayer(); 
AssetFileDescriptor afd = BeeDailyConvo.this.getAssets() 
    .openFd("sounds/"+file); 
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
afd.close();**//just added this line** 
player.prepare(); 
player.start(); 
+1

danke .. arbeitete für mich, aber ohne afd.close(); Arbeiten in Samsung meine 10 "ICS-Registerkarte, aber nicht in Nexus 7 Jellybean .. nach dem Hinzufügen afd.close(); arbeitete in Jeallybean !! –

1

Leider nur sehr wenig Informationen gibt es über die Fehlercodes Mediaplayer aus irgendeinem Grunde zur Verfügung. Ich schlage jedoch vor, dass Sie versuchen, Ihre Sounddatei in res/root/anstelle Ihrer Assets zu platzieren.

EDIT:

Hier startet mit der den MediaPlayer Abschnitt in der Entwickler-Dokumentation verwenden. Dies zeigt Ihnen, wie Sie den Sound richtig einrichten und abspielen.

EDIT 2:

stellt sich heraus, dass es tun kann von Vermögenswerten diese Frage sehen: Play audio file from the assets directory

+0

Eigentlich ich die Audio-Dateinamen in einer Datenbank und die realen Audio-Dateien in Assets-Ordner gespeichert. Ich benutze sqlite Abfrage, um den Dateinamen von der Datenbank abzurufen, und der Audio im Ordner Assets wird abgespielt, sobald auf eine bestimmte Audiodatei geklickt wird. Da ich nicht genau weiß, auf welches Audio geklickt wird, kann ich die Audiodateien nicht unter dem Ordner res/raw platzieren. irgendeine Idee? –

+0

danke für Ihre Antwort. Ja, das habe ich getan, aber es gibt mir einen Fehler, wie ich es schon gesagt habe. –

3

Hier können Sie alle Fehlercodes siehe Media player Error codes

-4 Fehlercode gibt an Sie ungültige Argumente gegeben.

Setzen Sie Ihren Code in try catch Block.

Versuchen Sie es mit

try { 
      AssetFileDescriptor afd = CustomListViewActivity.this.getAssets() 
        .openFd("sounds/hello_kr.wma"); 
      player.setDataSource(afd.getFileDescriptor()); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
+0

danke für Ihre Antwort. Ich habe deinen Vorschlag ausprobiert, kein Fehler mehr (1, -4) aber es gibt mir einen weiteren Fehler, der Media Player kann nicht erstellt werden. Hier ist mein Logcat 06-16 23: 33: 53.350: W/System.err (14869): \t bei android.media.MediaPlayer.setDataSource (native Methode) –

1

Ich glaube nicht, dass WMA-Dateien unterstützt werden.

http://developer.android.com/guide/appendix/media-formats.html

Ich habe bemerkt, dass Sie nicht die audioStreamType

mediaPlayer.setAudioStreamType (AudioManager.STREAM_MISIC) angegeben haben;

+0

Ja, ich habe auch festgestellt, dass ich meine Audiodatei in .wav konvertiert habe Format, aber immer noch gleichen Fehler "Media Player nicht erstellen". Wo muss ich die player.setAudioStream (AudioManager.STREAM_MUSIC) Zeile platzieren? editiert: Wie auch immer, es gibt setAudioSteamType-Funktion anstelle von setAudioStream. –

0

verwendet diese Art und Weise es Ihr Problem lösen :)

public void playBeep() { 
    try { 

     if (m.isPlaying()) { 
      m.stop(); 
      m.release(); 
      m = new MediaPlayer(); 
     } 
     AssetFileDescriptor descriptor = getAssets().openFd("mp3 name.mp3"); 
     m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 

     m.prepare(); 
     m.setVolume(1f, 1f); 
     m.setLooping(true); 
     m.start(); 
    } catch (Exception e) { 
    } 
}