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

Posted

技术标签:

【中文标题】从 Firebase 存储下载并播放 .mp3 文件到内存【英文标题】:Download and play .mp3 file from firebase storage to memory 【发布时间】:2017-05-01 19:57:04 【问题描述】:

我需要从我的 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
        
    );




 

【问题讨论】:

在 onFailure 方法中继续执行,从不进入 onSuccess 【参考方案1】:

我没有下载音频文件并将其暂时保存在内存中,而是找到了另一种解决方案,即从 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】:

这条线根本没有达到你的预期:

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

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

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

【讨论】:

在此之前的问题是执行永远不会进入 OnSuccess 方法,但总是在 onFailure 中。我可以看到在这两种方法中使用 textview。 请编辑您的问题以准确说明发生了什么。仅仅说“不工作”是不够的。打印出传递给失败侦听器的异常并查看它的内容。【参考方案3】:

你可以这样直播

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

要在本地下载它,请按照 Doug 的回复和这个Play Byte array in MediaPlayer - Android

【讨论】:

以上是关于从 Firebase 存储下载并播放 .mp3 文件到内存的主要内容,如果未能解决你的问题,请参考以下文章

保存和播放使用 Firebase 存储下载的视频

Cordova:Android 上的 sdcard 访问不起作用

我的网络应用程序用户如何单击按钮来播放本地存储的 mp3 文件?

带有播放列表的 flash mp3 播放器正在播放已删除或更改的歌曲

Firebase Analytics 如何处理后台活动的会话持续时间(mp3 播放器)

从内存流播放 mp3/wav 文件到网页