2017-05-01 310 views
1

我需要从我的firebase存储gs://fir-b9532.appspot.com/songs/song1.mp3下载mp3文件并将其播放到我的android应用程序中。 我想将mp3文件临时存储在设备的存储器中,用mediaplayer播放,然后播放一首新歌。从firebase存储下载并播放.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 
     } 
    }); 

} 


} 
+0

的excecution继续onFailure处的方法,从不在的onSuccess –

回答

2

除了下载音频文件并暂时将其保存在内存中之外,我发现另一种解决方案是通过实时流式传输来自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 
    } 
4

此行是不是在所有做你所期望的:

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

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

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

+0

在此之前,问题是,excecution永不熄灭的方法的onSuccess但总是在onFailure处。我可以看到在这两种方法中使用了textview。 –

+0

请编辑您的问题,以确切地说出发生了什么事。只是说“不工作”根本就不足以说明问题。打印出发送给失败监听器的异常,并查看它说了什么。 –