如何播放从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
相关产品推荐
相关产品推荐

