MediaPlayer在模拟器中传输MP3,但不在设备上传输

时间:2012-03-23 14:02:38

标签: android android-emulator android-mediaplayer

我正在使用MediaPlayer通过http流式传输MP3文件,它在模拟器中运行良好,这是我正在使用的代码的核心(针对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();

但是,当我尝试在设备上调试它(运行2.3.5的Motorola Droid RAZR)时,我收到以下错误:

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 个答案:

答案 0 :(得分:1)

更新 - 你有“错误(1,-1004)”,这是一个密切相关的答案:Android MediaPlayer error -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(),它会立即返回,而不是阻塞,直到有足够的数据被缓冲。”

答案 1 :(得分:0)

好的,这是我到达的解决方案:

阅读此帖后:

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

显而易见的是,我们试图做的事情永远不会在4.x之前的Android上运行,谷歌也无意修复它。鉴于此,我的应用程序进行了两项更改以使其正常工作:

  1. 实施了StreamProxy(http://code.google.com/p/npr-android-app/source/search?q=streamproxy&origq=streamproxy&btnG=Search+Trunk)方法,用于兼容mp3流媒体使用2.2之前的Android系统
  2. 修改API以将非SSL网址用于媒体文件来源
  3. 通过这两项更改,该应用程序现在适用于Droid RAZR,Kindle Fire以及我能提出的任何其他Android硬件。