Android Mediaplayer: setDataSource выходят для загруженного медиа-файла

У меня есть приложение, которое будет записывать и играть звуковые файлы. Некоторые звуковые файлы загружаются с помощью простых стандартных загрузок http с помощью httpclient. Это работало как очарование в течение долгого времени. Теперь внезапно я не могу играть файлы, которые я загружаю. Это перестало работать с этим стеком. Я храню файлы на 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;
    }
13
задан Erik 9 May 2010 в 16:56
поделиться

2 ответа

Решил сам. Как я сказал в своем комментарии выше, решение было следующим:

Когда я реорганизовал часть кода, я допустил опечатку в хэш-коде, который я использую для разрешения загрузки, а не для разрешения. К сожалению, у меня не было правильной ловушки, когда я загрузил файл, заставляя его быть пустым. Обычно я отправляю неверный заголовок запроса, если вы пытаетесь получить файл без правильного кода активации.

Причина заключалась в следующем:

        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, заявившей приложению, что загрузка была успешной, но это не так.

Извлеченный урок: всегда ставьте нулевые проверки для этих случаев, даже для прототипов. : -)

3
ответ дан 2 December 2019 в 02:11
поделиться

Во-первых, убедитесь, что ваше устройство не смонтировано. Либо Android, либо главный компьютер могут получить доступ к SD-карте, но не оба одновременно.

Во-вторых, неясно, почему вы используете FileInputStream и getFD () . Просто передайте путь к файлу на SD-карте в MediaPlayer (например, новый файл (Environment.getExternalStorageDirectory (), «yourfile.mp3») ) и позвольте проигрывателю открыться файл.

1
ответ дан 2 December 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: