我有一个应用程序,可以录制和播放音频文件。使用httpclient使用简单的标准http下载下载一些音频文件。它长久以来就像一种魅力。现在突然间我无法播放我下载的文件。它失败了这个堆栈。我将文件存储在SDCard上,我在手机和USB连接设备上都遇到了问题。
我已经检查过下载的文件在服务器上很酷,我可以毫无问题地播放它。
这些是我使用的代码片段(我知道recordingFile是文件的有效路径)。
// inside the activity class
private void playRecording() throws IOException{
File recordingFile = new File(recordingFileName);
FileInputStream recordingInputStream = new FileInputStream(recordingFile);
audioMediaPlayer.playAudio(recordingInputStream);
}
这是媒体播放器代码:
// inside my media player class which handles the recordings
public void playAudio(FileInputStream audioInputStream) throws IOException {
mediaPlayer.reset();
mediaPlayer.setDataSource(audioInputStream.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
}
以下是例外:
E/MediaPlayerService( 555): offset error
E/MediaPlayer( 786): Unable to to create media player
W/System.err( 786): java.io.IOException: setDataSourceFD failed.: status=0x80000000
W/System.err( 786): at android.media.MediaPlayer.setDataSource(Native Method)
W/System.err( 786): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:632)
W/System.err( 786): at net.xxx.xxx.AudioMediaPlayer.playAudio(AudioMediaPlayer.java:69)
W/System.err( 786): at net.xxx.xxx.Downloads.playRecording(Downloads.java:299)
W/System.err( 786): at net.xxx.xxx.Downloads.access$0(Downloads.java:294)
W/System.err( 786): at net.xxx.xxx.Downloads$1.onClick(Downloads.java:135)
我试过寻找偏移误差的一些答案,但不清楚这个问题可能是什么。
PS我用这段代码下载文件:
public FileOutputStream executeHttpGet(FileOutputStream fileOutputStream) throws ClientProtocolException, IOException{
try {
// Execute HTTP Post Request
httpResponse = httpClient.execute(httpPost, localContext);
int status = httpResponse.getStatusLine().getStatusCode();
// we assume that the response body contains the error message
if (status != HttpStatus.SC_OK) {
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
httpResponse.getEntity().writeTo(ostream);
fileOutputStream = null;
} else {
InputStream content = httpResponse.getEntity().getContent();
byte[] buffer = new byte[1024];
int len = 0;
while ( (len = content.read(buffer)) > 0 ) {
fileOutputStream.write(buffer,0, len);
}
fileOutputStream.close();
content.close(); // this will also close the connection
}
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
fileOutputStream = null;
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
fileOutputStream = null;
}
return fileOutputStream;
}
答案 0 :(得分:3)
我自己解决了。正如我在上面的评论中提出的解决方案是:
当我重构部分代码时,我在哈希码上写了一个错误,我用它来允许下载而不是。不幸的是,当我下载文件强制文件为空时,我没有正确的捕获。基本上,如果您尝试在没有正确激活码的情况下检索文件,我会发送错误的请求标头。
罪魁祸首在这里:
if (status != HttpStatus.SC_OK) {
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
httpResponse.getEntity().writeTo(ostream);
fileOutputStream = null;
} else {
InputStream content = httpResponse.getEntity().getContent();
byte[] buffer = new byte[1024];
int len = 0;
while ( (len = content.read(buffer)) > 0 ) {
fileOutputStream.write(buffer,0, len);
}
fileOutputStream.close();
content.close(); // this will also close the connection
}
对于状态代码返回错误的情况(即阻止访问的错误请求标头)。我错过的是捕获那里的空指针的情况,并导致更新SQLite条目声称应用程序下载成功,但事实并非如此。
获得的经验教训:即使对于原型,也要对这些情况进行空检查。 : - )
答案 1 :(得分:1)
首先,确保您的设备未安装。 Android或主机PC都可以访问SD卡,但不能同时访问SD卡。
其次,目前还不清楚您使用FileInputStream
和getFD()
的原因。只需将SD卡上文件的路径传递给MediaPlayer
(例如new File(Environment.getExternalStorageDirectory(), "yourfile.mp3")
),然后让播放器打开文件。