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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:24:56