从firebase存储下载并播放.mp3文件到内存

时间:2017-05-01 19:57:04

标签: android file firebase firebase-storage

我需要从我的firebase存储gs://fir-b9532.appspot.com/songs/song1.mp3下载一个mp3文件并将其播放到我的Android应用程序中。 我想将mp3文件临时存储在我设备的内存中,用媒体播放器播放然后再播放一首新歌。

我按照firebase手册编写以下简单代码,但似乎无效。任何想法都出错了?

package com.example.andreaskonstantakos.firebase;

 import android.media.MediaPlayer;
 import android.support.annotation.NonNull;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import com.google.android.gms.tasks.OnFailureListener;
 import com.google.android.gms.tasks.OnSuccessListener;
 import com.google.firebase.storage.FirebaseStorage;
 import com.google.firebase.storage.StorageReference;


 public class MainActivity extends AppCompatActivity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         FirebaseStorage storage = FirebaseStorage.getInstance();

         StorageReference storageRef = storage.getReference();
         StorageReference songsRef = storageRef.child("songs");
         StorageReference song1Ref = storageRef.child("songs/song1.mp3");

         final long ONE_MEGABYTE = 1024 * 1024;
         song1Ref.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
             @Override
             public void onSuccess(byte[] bytes) {
                 // Data for "songs/song1.mp3" is returns, use this as needed
                 MediaPlayer md = MediaPlayer.create(MainActivity.this,R.id.bytes);
                 md.setLooping(false);
                 md.start();
             }
    }).addOnFailureListener(new OnFailureListener() {
             @Override
             public void onFailure(@NonNull Exception exception) {
                 // Handle any errors
        }
    });

}


 }

3 个答案:

答案 0 :(得分:4)

这条线并没有完全符合您的期望:

MediaPlayer md = MediaPlayer.create(MainActivity.this,R.id.bytes);

R.id.bytes是名为bytes的ID资源。它包含一个整数。它不是您在成功监听器中接收的字节数组。

请记住,MediaPlayer无法播放存在于字节数组中的媒体。您必须将字节数组保存到文件中,并将MediaPlayer指向该文件以便使用create(Context context, Uri uri)进行回放。那么您应该在完成后删除该文件。

答案 1 :(得分:4)

不是下载音频文件而是暂时将其保存在内存中,而是通过firebase存储提供的完整URL(“https://firebasestorage.googleapis.com/v0/b/fir-b9532.appspot.com/o/songs%2Fsong1.mp3?alt=media&token=a4424b28-93c3-4a0c-a6b9-9136dcf63335”)实时流式传输歌曲,找到了另一种解决方案。

我只是加载我的MediaPlayer:

try {
        MediaPlayer player = new MediaPlayer();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setDataSource("https://firebasestorage.googleapis.com/v0/b/fir-b9532.appspot.com/o/songs%2Fsong1.mp3?alt=media&token=a4424b28-93c3-4a0c-a6b9-9136dcf63335");
        player.prepare();
        player.start();
    } catch (Exception e) {
        // TODO: handle exception
    }

答案 2 :(得分:0)

您可以像这样

ref.getDownloadUrl().addOnSuccessListener{
            try {
                mediaPlayer.setDataSource(uri);
         } catch (IOException e) {}
}

按照Doug的回复和此Play Byte array in MediaPlayer - Android

的要求将其本地下载。