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?

  • Klassenerweiterung Anwendung wirft ClassNotFoundException
  • Senden von Bildern mit Http Post
  • Wie kann ich auf die Kamera auf Android-Handys zugreifen?
  • Gruppieren Sie mehrere Apps unter demselben Symbol in Application Launcher
  • Googletest für Android NDK
  • Ist es möglich, etwas anderes als eine Listenansicht als Schiebe-Schublade in drawerlayout zu verwenden
  • Gibt es irgendeinen Punkt einer Aktivität mit einem Fragment?
  • Wie registriere ich einen URL-Namespace (myapp: //app.start/) für den Zugriff auf dein Programm durch den Aufruf einer URL im Browser in Android OS?
  • In einem Android-Gradle-Build, ändern Sie den Inhalt von strings.xml während des Builds
  • Erstellen von Standardstil mit benutzerdefinierten Attributen
  • Android Haupt-Thread blockiert WebView Thread
  • Wie schreibe ich einen benutzerdefinierten Filter für ListView mit ArrayAdapter
  • 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.