从 firebase 存储下载并播放 .mp3 文件到内存
Download and play .mp3 file from firebase storage to memory
我需要从我的 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
}
});
}
}
这一行完全没有达到您的预期:
MediaPlayer md = MediaPlayer.create(MainActivity.this,R.id.bytes);
R.id.bytes
是一个名为bytes
的id资源。它包含一个整数。它不是您在成功侦听器中接收到的字节数组。
另请记住,MediaPlayer 无法播放存在于字节数组中的媒体。您必须改为将字节数组保存到文件中,然后将 MediaPlayer 指向该文件以使用 create(Context context, Uri uri) 进行播放。那么你应该在完成后删除该文件。
我没有下载音频文件并将其暂时保存在内存中,而是找到了另一种解决方案,即从 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
}
你可以这样直播
ref.getDownloadUrl().addOnSuccessListener{
try {
mediaPlayer.setDataSource(uri);
} catch (IOException e) {}
}
要在本地下载它,请按照 Doug 的回复和此 Play Byte array in MediaPlayer - Android
我需要从我的 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
}
});
}
}
这一行完全没有达到您的预期:
MediaPlayer md = MediaPlayer.create(MainActivity.this,R.id.bytes);
R.id.bytes
是一个名为bytes
的id资源。它包含一个整数。它不是您在成功侦听器中接收到的字节数组。
另请记住,MediaPlayer 无法播放存在于字节数组中的媒体。您必须改为将字节数组保存到文件中,然后将 MediaPlayer 指向该文件以使用 create(Context context, Uri uri) 进行播放。那么你应该在完成后删除该文件。
我没有下载音频文件并将其暂时保存在内存中,而是找到了另一种解决方案,即从 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
}
你可以这样直播
ref.getDownloadUrl().addOnSuccessListener{
try {
mediaPlayer.setDataSource(uri);
} catch (IOException e) {}
}
要在本地下载它,请按照 Doug 的回复和此 Play Byte array in MediaPlayer - Android