2010-02-21 5 views
0

Мой код пытается воспроизвести файл MP3 из res/raw.Необъяснимая ошибка MediaPlayer

Код:

FileDescriptor fd = appContext.getResources().openRawResourceFd(R.raw.ringtone) 
        .getFileDescriptor(); 
player = new MediaPlayer(); 
      try 
      { 
       player.setAudioStreamType(AudioManager.STREAM_RING); 
       player.setDataSource(fd); 
       player.prepare();   
      } 
      catch (IllegalArgumentException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       player = null; 
       return; 
      } 
      catch (IllegalStateException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       player = null; 
       return; 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       player = null; 
       return; 
      } 

      player.setLooping(true); 
      player.start(); 

В журнале:

02-21 15: 18: 18,360: ERROR/PlayerDriver (51): Команда PLAYER_SET_DATA_SOURCE завершается с ошибкой или информация PVMFErrNotSupported 02-21 15: 18: 18,380: оШИБКА/медиаплеера (693): ошибка (1, -4) 02-21 15: 18: 18,390: WARN/PlayerDriver (51): PVMFInfoErrorHandlingComplete

После player.prepare() называется ,

У меня действительно нет подсказки. Я не буду использовать MediaPlayer.create(), потому что мне нужен player.setAudioStreamType (AudioManager.STREAM_RING);

бы признателен за любую помощь по этому ...

+0

ли вы попробовать с другим файлом? – Macarse

+0

Я могу воспроизвести тот же файл с MediaPlayer.create(), поэтому я знаю, что это не проблема формата. –

ответ

3

От MediaPlayer API docs:

Когда MediaPlayer объект просто создан с использованием новых или после reset() называется, он находится в Idle состояние; и после release() называется Конец состояние. Между этими двумя состояниями является жизненный цикл объекта MediaPlayer.

Это ошибка программирования к методов Invoke, таких как getCurrentPosition(), ..., setAudioStreamType(int) в Idle состоянии.

Вы должны изучить диаграмму жизненного цикла MediaPlayer и привести примеры и переписать свой код по отношению к ним. В этом случае, вы увидите, что вам необходимо позвонить по телефону setDataSource()доsetAudioStreamType().

alt text


Примечание стороны: В Android, вам действительно нужно следить за жизненным циклом событий за все, что вы делаете, или вы будете укушены. Вы можете написать неправильный код, и вы никогда не узнаете его до времени исполнения, или, что еще хуже, вы можете написать код, который, по вашему мнению, будет работать, и вы обнаружите только в странных обстоятельствах, что это не так ... например. изменение ориентации экрана и метод обратного вызова в этом случае не совпадают или другие подобные ситуации (кнопка «Главная» ... и т. д.).

+0

Спасибо, но: 1.Нет никакой документации о правильном состоянии жизненного цикла для вызова setAudioStreamType(). 2. Я попробовал то, что вы уже сказали, и это дало ту же ошибку ... –

+0

Извините, мое первое предложение не соответствует действительности, но оно все еще не работает :( –

2

Я имел аналогичные проблемы при попытке установить тип аудио поток, и я нашел это руководство полезным: API gaps: an Android MediaPlayer example

+0

Черт! Ты спас мой день!! D – M2X

Смежные вопросы