MediaPlayer транслирует MP3 в эмулятор, но не на устройство - PullRequest
0 голосов
/ 23 марта 2012

Я использую MediaPlayer для потоковой передачи файлов MP3 через http, и он прекрасно работает в эмуляторе, вот суть кода, который я использую (для sdk версии 8):

// play selected track      
    if(mediaplayer.isPlaying()){
        mediaplayer.reset();
    }

    try {
        mediaplayer.setDataSource(selectedTrack.url);
        mediaplayer.prepare();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    mediaplayer.start();

Однако, когда я пытаюсь отладить его на устройстве (Motorola Droid RAZR под управлением 2.3.5), я получаю ошибку ниже:

03-23 08:51:02.873: E/MediaPlayer(9442): error (1, -1004)
03-23 08:51:02.873: W/System.err(9442): java.io.IOException: Prepare failed.: status=0x1

Вот полная трассировка стека для запуска:

03-23 08:50:44.842: W/ActivityThread(9442): Application com.murfie.murfdroid is waiting for the debugger on port 8100...
03-23 08:50:44.850: I/System.out(9442): Sending WAIT chunk
03-23 08:50:44.858: I/dalvikvm(9442): Debugger is active
03-23 08:50:45.045: I/System.out(9442): Debugger has connected
03-23 08:50:45.045: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:45.248: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:45.451: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:45.654: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:45.850: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:46.053: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:46.256: I/System.out(9442): waiting for debugger to settle...
03-23 08:50:46.451: I/System.out(9442): debugger has settled (1490)
03-23 08:50:46.865: D/dalvikvm(9442): GC_EXTERNAL_ALLOC freed 52K, 44% free 3066K/5379K, external 2756K/2773K, paused 28ms
03-23 08:50:52.803: D/dalvikvm(9442): GC_EXTERNAL_ALLOC freed 83K, 42% free 3194K/5447K, external 3453K/3470K, paused 26ms
03-23 08:50:55.912: D/dalvikvm(9442): GC_EXTERNAL_ALLOC freed 21K, 42% free 3208K/5447K, external 4323K/4499K, paused 36ms
03-23 08:50:55.975: D/dalvikvm(9442): GC_EXTERNAL_ALLOC freed 3K, 42% free 3205K/5447K, external 5259K/5399K, paused 25ms
03-23 08:51:02.873: E/MediaPlayer(9442): error (1, -1004)
03-23 08:51:02.873: W/System.err(9442): java.io.IOException: Prepare failed.: status=0x1
03-23 08:51:02.904: W/System.err(9442):     at android.media.MediaPlayer.prepare(Native Method)
03-23 08:51:02.912: W/System.err(9442):     at com.murfie.murfdroid.Murfdroid.playSelectedTrack(Murfdroid.java:162)
03-23 08:51:02.912: W/System.err(9442):     at com.murfie.murfdroid.Murfdroid.access$3(Murfdroid.java:151)
03-23 08:51:02.912: W/System.err(9442):     at com.murfie.murfdroid.Murfdroid$4.onClick(Murfdroid.java:130)
03-23 08:51:02.920: W/System.err(9442):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:932)
03-23 08:51:02.920: W/System.err(9442):     at android.widget.AdapterView.performItemClick(AdapterView.java:290)
03-23 08:51:02.928: W/System.err(9442):     at android.widget.ListView.performItemClick(ListView.java:3602)
03-23 08:51:02.928: W/System.err(9442):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1838)
03-23 08:51:02.928: W/System.err(9442):     at android.os.Handler.handleCallback(Handler.java:587)
03-23 08:51:02.936: W/System.err(9442):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-23 08:51:02.936: W/System.err(9442):     at android.os.Looper.loop(Looper.java:130)
03-23 08:51:02.936: W/System.err(9442):     at android.app.ActivityThread.main(ActivityThread.java:3859)
03-23 08:51:02.944: W/System.err(9442):     at java.lang.reflect.Method.invokeNative(Native Method)
03-23 08:51:02.944: W/System.err(9442):     at java.lang.reflect.Method.invoke(Method.java:507)
03-23 08:51:02.944: W/System.err(9442):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:840)
03-23 08:51:02.944: W/System.err(9442):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:598)
03-23 08:51:02.951: W/System.err(9442):     at dalvik.system.NativeStart.main(Native Method)
03-23 08:51:02.951: E/MediaPlayer(9442): start called in state 0
03-23 08:51:02.951: E/MediaPlayer(9442): error (-38, 0)
03-23 08:51:02.975: E/MediaPlayer(9442): Error (-38,0)

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

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Обновление - у вас есть «error (1, -1004)», и вот вам тесно связанный ответ: Ошибка Android MediaPlayer -1004 (ERROR_IO)

Вот что-то, что может бытьрелевантно:

http://developer.android.com/reference/android/media/MediaPlayer.html#prepare() "Для файлов можно вызывать метод prepare (), который блокируется, пока MediaPlayer не будет готов к воспроизведению."

http://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync() "Для потоков следует вызывать prepareAsync (), которая немедленно возвращает значение, а не блокирует, пока не будет буферизовано достаточное количество данных. "

0 голосов
/ 11 апреля 2012

Хорошо, вот решение, к которому я пришел:

После прочтения этой темы:

http://code.google.com/p/android/issues/detail?id=17553

Стало очевидным, что то, что мы пытались сделать, никогда не будетработать на Android до 4.x и Google не собирался это исправлять.Учитывая это, я сделал два изменения в моем приложении, чтобы оно заработало:

  1. Реализован подход StreamProxy (http://code.google.com/p/npr-android-app/source/search?q=streamproxy&origq=streamproxy&btnG=Search+Trunk), используемый для обеспечения совместимости потоковой передачи mp3 с системами Android до 2.2)
  2. ИзмененоAPI для использования не-SSL URL-адресов для источников медиа-файлов

С этими двумя изменениями приложение теперь работает на Droid RAZR, Kindle Fire и любом другом оборудовании Android, которое я могу придумать.

...