Android中通过PHP连接MediaPlayer播放MP3报错求助
解决Android MediaPlayer通过PHP播放MP3时的prepare报错问题
你的问题核心在于PHP返回的HTTP响应头不符合MediaPlayer的流式播放要求——虽然浏览器能正常触发下载,但MediaPlayer需要的是可直接解析的音频流,而非触发下载的附件响应。
问题分析
你的PHP代码里有两个关键错误:
Content-Type设置成了application/vnd.android.package-archive,这是安卓安装包的MIME类型,完全不是音频格式,MediaPlayer无法识别响应内容为音频文件Content-Disposition: attachment会告诉客户端把内容当作附件下载,但MediaPlayer期望的是可直接流式播放的媒体内容,这个头会干扰它的解析逻辑
修复步骤
修改你的PHP代码,调整响应头为适合MP3流式播放的配置:
<?php $file = 'directory/file.mp3'; // 先检查文件是否存在,避免无意义报错 if (!file_exists($file)) { http_response_code(404); exit("Target MP3 file not found"); } // 设置正确的音频MIME类型 header('Content-Type: audio/mpeg'); // 标记为可直接播放的内容,而非附件 header('Content-Disposition: inline; filename="file.mp3"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Content-Length: ' . filesize($file)); // 清空输出缓冲区,确保音频内容纯净输出 ob_clean(); flush(); readfile($file); exit; ?>
Android端额外注意事项
- 确保你的AndroidManifest.xml中添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 不要在主线程调用
prepare()方法(Android 3.0+会触发NetworkOnMainThreadException),建议改用异步准备并设置监听器:
MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); String ip = "http://myIp:80/rec.php"; try { mediaPlayer.setDataSource(ip); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); }
这样修改后,MediaPlayer就能正确识别PHP返回的音频流,完成prepare并正常播放了。
内容的提问来源于stack exchange,提问作者Rob12
相关产品推荐
相关产品推荐

