Android – Mp3 von Byte spielen

Ich habe meine mp3-Datei in Byte [] (heruntergeladen von einem Service) und ich möchte es auf meinem Gerät ähnlich wie Sie Dateien abspielen können:

MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start(); 

Aber ich kann nicht scheinen, einen Weg zu finden, es zu tun. Ich würde nichts dagegen haben, die Datei zu telefonieren und dann zu spielen. Wie kann ich die Datei abspielen oder abspielen?

  • Android: Force Daten über Funk über WiFi gesendet werden
  • Wie man eine Fortschrittsanzeige in Android anpasst
  • Gibt es eine Begrenzung der Länge des Schlüssels (String) im JS-Objekt?
  • Zeichne mehrere Formen mit ShapeDrawable in xml mit Android
  • Selektor benötigt ein ziehbares Attribut?
  • Crashlytics / Fabric berichtet nicht auf Android
  • Android: Kannst du einen Ripple-Effekt haben, dessen Standard-Statusfarbe transparent ist?
  • Android: was mit der Anwendung / smil MIME-Typ zu tun
  • Was ist der Unterschied zwischen Parcelable und Serialization in Android verwendet
  • Android Geräteorientierung ohne geomagnetisch
  • Hilfe beim Erhalten von String Array aus arrays.xml Datei
  • Androids ObjectAnimator.ofFloat funktioniert nicht richtig
  • 6 Solutions collect form web for “Android – Mp3 von Byte spielen”

    OK, danke an euch allen, aber ich musste mp3 von Byte spielen [], wie ich das von .NET Webservice bekomme (möchte nicht dynamisch generierte mp3s auf dem Server speichern).

    Am Ende – es gibt eine Reihe von "gotchas" zu spielen einfach mp3 … hier ist Code für alle, die es braucht:

     private MediaPlayer mediaPlayer = new MediaPlayer(); private void playMp3(byte[] mp3SoundByteArray) { try { // create temp file that will hold byte array File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir()); tempMp3.deleteOnExit(); FileOutputStream fos = new FileOutputStream(tempMp3); fos.write(mp3SoundByteArray); fos.close(); // resetting mediaplayer instance to evade problems mediaPlayer.reset(); // In case you run into issues with threading consider new instance like: // MediaPlayer mediaPlayer = new MediaPlayer(); // Tried passing path directly, but kept getting // "Prepare failed.: status=0x1" // so using file descriptor instead FileInputStream fis = new FileInputStream(tempMp3); mediaPlayer.setDataSource(fis.getFD()); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException ex) { String s = ex.toString(); ex.printStackTrace(); } } 

    EDIT: Ich habe diese Antwort vor mehr als 4 Jahren geschrieben – offensichtlich haben sich seither viele Dinge verändert. Siehe Justin's Kommentar zur Wiederverwendung von MediaPlayer-Instanz. Auch ich weiß nicht, ob .deleteOnExit () wird für Sie jetzt arbeiten – fühlen Sie sich frei, um Verbesserungen vorzuschlagen, so dass Temp-Dateien nicht aufhäufen.

    Nicht sicher über Bytearrays / Bytestreams, aber wenn Sie eine URL aus dem Dienst haben, können Sie versuchen, die Datenquelle zu einem Netzwerk-URI durch Aufruf zu setzen

     setDataSource(Context context, Uri uri) 

    Siehe die API-Dokumente .

    Ich habe eine einfache Lösung gefunden, indem ich meine MP3-Datei als Base64 kodiere (ich erhalte bereits die Daten, die von einem Restful API Service codiert wurden) und dann das Erstellen eines URL-Objekts. Ich habe es in Android 4.1 getestet.

     public void PlayAudio(String base64EncodedString){ try { String url = "data:audio/mp3;base64,"+base64EncodedString; MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start(); } catch(Exception ex){ System.out.print(ex.getMessage()); } } 

    Streaming Audio von einer URL in Android mit MediaPlayer?

    falscher Code:

      MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start(); 

    CORRECT CODE:

      MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.setOnpreparedListener(this); mp.prepare(); //Implement OnPreparedListener OnPrepared() { mp.start(); } 

    Siehe API Demos ..

    Starten von Android MarshMellow (Version Code 23), gibt es neue API, die dies möglich machen wird.

    MediaPlayer.setDataSource (android.media.MediaDataSource)

    Sie können eine benutzerdefinierte Implementierung von MediaDataSource bereitstellen und ein Byte [] verpacken. Eine grundlegende Implementierung unten gegeben.

     import android.annotation.TargetApi; import android.media.MediaDataSource; import android.os.Build; import java.io.IOException; @TargetApi(Build.VERSION_CODES.M) public class ByteArrayMediaDataSource extends MediaDataSource { private final byte[] data; public ByteArrayMediaDataSource(byte []data) { assert data != null; this.data = data; } @Override public int readAt(long position, byte[] buffer, int offset, int size) throws IOException { System.arraycopy(data, (int)position, buffer, offset, size); return size; } @Override public long getSize() throws IOException { return data.length; } @Override public void close() throws IOException { // Nothing to do here } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.