1

私はゲームを作っています。曲のリストをバックグラウンドで再生し、すべてが終わったらループさせたいと思っています。これを行うために、sを作成し、それが最後のアイテムでない限り、リスト内の次のプレーヤーでMediaPlayer呼び出すことをループします。setNextMediaPlayer次に、リストの最初の項目に戻します。これは機能しますが、ループして最初の曲をもう一度再生しようとするとplay()、無効な状態で呼び出したことが通知されます。だから私OnCompleteListenerは曲が終わったときにprepare()もう一度それを呼び出すように追加しましたが、それは役に立ちませんでした。MediaPlayerもう一度再生するには、最後に達したaに対して何をする必要がありますか?

-= UPDATE =-これが初期化のための私のコードですMediaPlayers(それはただそれを混乱させるので、tryとcatchsを除いて):

String[] assets = manager.list("songs");
Collections.shuffle(Arrays.asList(assets));

for(String name : assets)
{
    MediaPlayer player = new MediaPlayer();
    AssetFileDescriptor descriptor = manager.openFd("songs/"+name);

    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    player.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
    player.setOnCompletionListener(_reset);
    player.prepare();

    if(_songs.size() > 0)
    {
        _songs.get(_songs.size() - 1).setNextMediaPlayer(player);
    }

    _songs.add(player);
}

_songs.get(_songs.size() - 1).setNextMediaPlayer(_songs.get(0));
4

1 に答える 1

0

prepare内部を呼び出した後に同じエラーが発生する場合は、現在準備されていないonCompleteListener次のがの前に呼び出されたことが原因である可能性があります。MediaPlayeronCompleteListener

私はあなたの問題を解決し、同様により効率的になるかもしれない別のアプローチを提案します:

  • Circular Linked List現在の曲名を付けて次の曲名を付けるなど、いくつかのデータ構造で曲の順序を維持します
  • 最初の曲を準備して再生を開始します
  • オーバーライドonPreparedしてデータ構造から次の曲名を取得setNextMediaPlayerし、新しく作成して準備したMediaPlayerオブジェクトで呼び出します

MediaPlayer事前に多くのインスタンスを作成しないため、このアプローチの方が効率的だと思います。nextMediaPlayerまた、現在の曲を始めるたびに準備をしておきます。

于 2013-02-25T02:59:55.343 に答える