2017-05-01 494 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

請編輯您的問題,以確切地說出發生了什麼事。只是說「不工作」根本就不足以說明問題。打印出發送給失敗監聽器的異常,並查看它說了什麼。 –