You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何播放从Firebase下载的音频文件?安卓开发求助

解决安卓下载Firebase音频后无法播放的问题

你的代码已经实现了音频下载功能,但缺少下载完成后的文件定位和MediaPlayer播放逻辑,以下是具体修复方案:

1. 监听下载完成事件,获取本地文件Uri

使用DownloadManager下载后,需要注册广播接收器跟踪下载完成状态,拿到文件的本地访问路径:

private BroadcastReceiver downloadCompleteReceiver;
private long downloadId; // 保存下载任务ID,用于匹配完成事件

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

    MichaelFranzeseBtn = findViewById(R.id.MichaelFranzeseBtn);
    mediaPlayer = new MediaPlayer();

    // 注册下载完成广播接收器
    downloadCompleteReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            long completedId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if (completedId == downloadId) {
                // 下载完成,获取本地文件Uri
                DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                Uri localAudioUri = downloadManager.getUriForDownloadedFile(completedId);
                if (localAudioUri != null) {
                    playLocalAudio(localAudioUri);
                }
            }
        }
    };
    registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

    MichaelFranzeseBtn.setOnClickListener(v -> download());
}

// 修改downloadFiles方法,保存下载任务ID
public void downloadFiles(Context context,String fileName,String fileExtension,String destinationDirectory,String url) {
    DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
    Uri uri = Uri.parse(url);
    DownloadManager.Request request = new DownloadManager.Request(uri);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalFilesDir(context,destinationDirectory,fileName+fileExtension);
    downloadId = downloadManager.enqueue(request); // 保存任务ID
}

2. 实现MediaPlayer播放逻辑

添加播放本地音频的方法,处理MediaPlayer的初始化、数据源加载和播放操作:

private void playLocalAudio(Uri audioUri) {
    try {
        mediaPlayer.reset();
        mediaPlayer.setDataSource(this, audioUri);
        mediaPlayer.prepare(); // 同步准备,若音频文件较大建议用prepareAsync()加监听
        mediaPlayer.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 释放资源,避免内存泄漏

在Activity销毁时,注销广播接收器并释放MediaPlayer资源:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (downloadCompleteReceiver != null) {
        unregisterReceiver(downloadCompleteReceiver);
    }
    if (mediaPlayer != null) {
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

关键说明

  • 之前的代码仅触发下载流程,但未监听下载完成事件,导致无法获取本地文件路径
  • 使用DownloadManager.getUriForDownloadedFile(downloadId)可直接获取下载后的文件Uri,避免手动拼接路径引发的错误
  • MediaPlayer需正确设置数据源,并处理IO异常情况

内容的提问来源于stack exchange,提问作者Badr_ G9mer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:31:02