13

我有一个可以录制和播放音频文件的应用程序。一些音频文件是使用 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;
    }
4

2 回答 2

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 条目被更新,声称下载成功但没有成功。

经验教训:即使对于原型,也要始终对这些情况进行空检查。:-)

于 2010-05-09T18:58:09.547 回答
1

首先,确保您的设备未安装。Android 或主机 PC 都可以访问 SD 卡,但不能同时访问两者。

其次,不清楚您为什么使用FileInputStreamand getFD()。只需将 SD 卡上文件的路径传递给MediaPlayer(例如,new File(Environment.getExternalStorageDirectory(), "yourfile.mp3")),然后让播放器打开文件。

于 2010-05-09T17:18:41.850 回答