Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Mediaplayer:下载的媒体文件的setDataSource问题_Android_Audio_Media Player_Sd Card - Fatal编程技术网

Android Mediaplayer:下载的媒体文件的setDataSource问题

Android Mediaplayer:下载的媒体文件的setDataSource问题,android,audio,media-player,sd-card,Android,Audio,Media Player,Sd Card,我有一个应用程序,将记录和播放音频文件。一些音频文件是使用httpclient通过简单的标准http下载来下载的。在很长一段时间里,它像一个符咒一样发挥作用。现在我突然不能播放我下载的文件了。该堆栈失败。我将文件存储在SD卡上,在手机和USB连接设备上都遇到了问题 我已经检查了下载的文件在服务器上是否很酷,我可以毫无问题地播放它 这些是我使用的代码片段(我知道recordingFile是文件的有效路径) 以下是媒体播放器代码: // inside my media player clas

我有一个应用程序,将记录和播放音频文件。一些音频文件是使用httpclient通过简单的标准http下载来下载的。在很长一段时间里,它像一个符咒一样发挥作用。现在我突然不能播放我下载的文件了。该堆栈失败。我将文件存储在SD卡上,在手机和USB连接设备上都遇到了问题

我已经检查了下载的文件在服务器上是否很酷,我可以毫无问题地播放它

这些是我使用的代码片段(我知道recordingFile是文件的有效路径)

以下是媒体播放器代码:

    // 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 I下载带有以下代码的文件:

    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;
    }

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


其次,不清楚为什么要使用
FileInputStream
getFD()
。只需将SD卡上文件的路径传递到
MediaPlayer
(例如
新文件(Environment.getExternalStorageDirectory(),“yourfile.mp3”)
,然后让播放器打开文件。

我自己解决了这个问题。正如我在上面所说,我对解决方案的看法是:

    // inside the activity class
    private void playRecording() throws IOException{
        File recordingFile = new File(recordingFileName);
        FileInputStream recordingInputStream = new FileInputStream(recordingFile); 
        audioMediaPlayer.playAudio(recordingInputStream);
    }
当我重构部分代码时,我在一个散列代码上打了个错别字,我用它来允许下载,而不是下载。不幸的是,当我下载文件时,没有正确的捕获,强制文件为空。基本上,如果您试图检索没有正确激活码的文件,我会发送一个错误的请求头

罪犯在这里:

        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条目被更新,并向应用程序声明下载成功,但它没有成功


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

谢谢你的回答。但是我发现了这个问题,它与调用后不检查fileOutputStream的空指针无关。我有一个Web服务器,可以使不同的播放列表保持同步。当我重构部分代码时,我在一个散列代码上打了个错别字,我用它来允许下载,而不是下载。不幸的是,当我下载文件时,没有正确的捕获,强制文件为空。基本上,如果您试图检索没有正确激活码的文件,我会发送一个错误的请求头。它现在已解决,工作正常。:-)我使用getFD来确保我可以打开文件,而不必担心权限问题。我发现在处理SD卡上的文件时,这样做“更安全”。在某些设备上(真的!)mediaplayer(位于单独的进程上)无法访问应用程序私有文件。我尝试播放下载到应用程序内部缓存的MIDI文件。mediaplayer向logcat发出“(权限被拒绝)”。@yuku:Use
FileProvider
@commonware谢谢!目前,我使用新的FileInputStream(thePrivatFile).getFD(),然后将其传递给获取FD的setDataSource。至少在我试过的安卓2.3、4.1、4.4上可以运行。