2017-05-21 3 views
0

Ich baue gerade eine Soundboard-App als mein erstes kleines Android-App-Projekt. Ich habe eine Menge .mp3-Dateien im Ordner "Assets" meiner App gespeichert und dann dynamisch Schaltflächen basierend auf den dort gespeicherten .mp3-Dateien erstellt. Im Tag jeder Taste speicherte ich den entsprechenden .mp3-Dateinamen.Das Asset kann nicht als Datenquelle im Mediaplayer eingestellt werden

Im onClick() Ereignis jeder Schaltfläche, ich versuche, die DataSource eines globalen MediaPlayer auf die Datei von meinem Vermögen zu setzen. Der FileDescriptor verarbeitet den openFd-Befehl einwandfrei, aber der MediaPlayer kann die DataSource nicht festlegen.

Die App nur abstürzt, nach diesem Befehl ausgeführt wird. Hier ist die OnClickListener:

tempButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) {     
     mediaPlayer.release(); 
     String tag = v.getTag().toString(); 

     try { 
      AssetFileDescriptor afd = getAssets().openFd(tag + ".mp3"); 
      mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
      afd.close(); 

      mediaPlayer.prepare(); 
      mediaPlayer.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
}); 

Die logcat druckt den folgenden Absturz bei der setDataSource() -Methode ausführen:

05-22 16:23:45.191 4505-4505/com.development.alo.dasunterboard E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.development.alo.dasunterboard, PID: 4505 
    java.lang.IllegalStateException 
     at android.media.MediaPlayer._setDataSource(Native Method) 
     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1133) 
     at com.development.alo.dasunterboard.MainActivity$2.onClick(MainActivity.java:79) 
     at android.view.View.performClick(View.java:5198) 
     at android.view.View$PerformClick.run(View.java:21147) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

ich einen Blick in die MediaPlayer.java nahm, weil der Absturz dort zu geschehen scheint. Es sieht aus wie der FileDescriptor nicht gültig.

+0

'Die App sehen nur crashes' die Ausnahme Stacktrace für den Grund, warum es abstürzt. –

+0

Mögliches Duplikat von [Leider ist MyApp gestoppt. Wie kann ich dieses Problem lösen?] (Http://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this) –

+0

Es gewann ' t auch dort bekommen .. Ich habe ein Unterbrechungspunkt zum e.printStackTrace, aber bevor es dort ankommt, wird die App sofort geschlossen. –

Antwort

0

sollten Sie nicht release() MediaPlayer vor der Einstellung DataSource, aber sollte reset() es. Replase mediaPlayer.release(); mit mediaPlayer.reset();

+0

Das war es! Vielen Dank Kumpel! Wenn Sie die Android API-Beschreibung über diese beiden Methoden zu lesen macht es auch total Sinn :) https://developer.android.com/reference/android/media/MediaPlayer.html –

Verwandte Themen