2013-05-22 4 views
2

Я хотел бы подготовить два MediaPlayers в том же действии. Я буферизую mp3 из сети, и, поскольку это занимает некоторое время, моя идея ускорить это: когда первый образец играет, второй готовится.Подготовка двух MediaPlayers в том же действии

К сожалению, я не могу заставить его работать. То есть метод буферизации:

private void getMusic(MediaPlayer player, String url) { 

    player = new MediaPlayer(); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    try { 
     player.setDataSource(url); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    player.setOnPreparedListener(this); 
    player.prepareAsync();   
} 

И это onPrepared метод.

Я думал, что если игрок будет готов, я могу снова использовать prepareAsync(). Я пробовал некоторые другие идеи, но никто не помогал. Проблема заключается в prepareAsync(), потому что, когда я использовал prepare(), проблем не было.

Это мои ошибки:

05-23 01:35:22.848: E/MediaPlayer(29894): prepareAsync called in state 1 
05-23 01:35:22.858: D/AndroidRuntime(29894): Shutting down VM 
05-23 01:35:22.858: W/dalvikvm(29894): threadid=1: thread exiting with uncaught exception (group=0x40ab0228) 
05-23 01:35:22.868: E/AndroidRuntime(29894): FATAL EXCEPTION: main 
05-23 01:35:22.868: E/AndroidRuntime(29894): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.crivline.musicGame/com.crivline.musicGame.NewGame}: java.lang.IllegalStateException 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.ActivityThread.access$600(ActivityThread.java:139) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.os.Looper.loop(Looper.java:156) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.ActivityThread.main(ActivityThread.java:4977) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at java.lang.reflect.Method.invokeNative(Native Method) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at java.lang.reflect.Method.invoke(Method.java:511) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at dalvik.system.NativeStart.main(Native Method) 
05-23 01:35:22.868: E/AndroidRuntime(29894): Caused by: java.lang.IllegalStateException 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.media.MediaPlayer._prepareAsync(Native Method) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.media.MediaPlayer.prepareAsync(MediaPlayer.java:1357) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.crivline.musicGame.NewGame.getMusic(NewGame.java:460) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.crivline.musicGame.NewGame.selectPlayer(NewGame.java:427) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.crivline.musicGame.NewGame.prepareMediaPlayer(NewGame.java:413) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.crivline.musicGame.NewGame.getData(NewGame.java:270) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at com.crivline.musicGame.NewGame.onCreate(NewGame.java:125) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.Activity.performCreate(Activity.java:4538) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
05-23 01:35:22.868: E/AndroidRuntime(29894): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161) 
05-23 01:35:22.868: E/AndroidRuntime(29894): ... 11 more 

Большое спасибо за помощь заранее!

+0

проблема отображается для первой или второй? – stinepike

+0

Для второго. – pawko

ответ

1

Я установил, что с пользовательским помощью «Pesal». Правильный код:

MediaPlayer mp1 = new MediaPlayer(); 
    MediaPlayer mp2 = new MediaPlayer(); 

    try { 
     mp1.setDataSource("source1"); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     mp2.setDataSource("source2"); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    mp1.setOnPreparedListener(new OnPreparedListener() { 

     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 
    mp1.prepareAsync(); 

    mp2.setOnPreparedListener(new OnPreparedListener() { 

     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 
    mp2.prepareAsync(); 
1

У вас одно и то же имя для обоих медиаплееров. Здесь вы начинаете воспроизведение, поэтому ваш проигрыватель MediaPlayer находится в состоянии .start(), когда вы получаете другой MediaPlayer, медиаплеер получает одноименного игрока и переходит в состояние .prepare(). Android MediaPlayer не позволяет перейти непосредственно от начала, чтобы подготовить его снова. Вы должны сначала остановиться, прежде чем готовиться. Вот решение создать два медиаплеера;

MediaPlayer mp1 = new MediaPlayer(); 
    MediaPlayer mp2 = new MediaPlayer(); 

    mp1.setDataSource(yoururl); 
    mp2.setDataSource(nexturl); 

    mp1.preapareAsync(); 
    @Override 
    public void onPrepared(MediaPlayer mp1) { 

    mp1.start(); 
    } 
    mp2.prepare(); 
    mp1.setNextMediaPlayer(mp2); 

Проверьте блок-схема медиаплеер здесь, чтобы увидеть, какие состояния Возможное, чтобы перейти от одного к другому http://developer.android.com/reference/android/media/MediaPlayer.html

+0

Я подготовил два разных экземпляра MediaPlayer, но я вызвал их из того же метода. Ваш код почти прав, eclipse не может отлаживать «mp1.setNextMediaPlayer (mp2)». Ниже я вставляю правильный код, чтобы исправить это. Большое спасибо за помощь! – pawko

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