0

私が現在書いているアプリケーションでは、ユーザーはデータベースからエントリを選択し、そのエントリの内容を再生できます。エントリは多数のサウンド ファイルで構成されています (制限なし)。私のアプリケーションでは、(データベースに保存されている) エントリのサウンド ファイルの URI の場所をリストで返します。コードは次のとおりです。

public void audioPlayer() {
    // set up MediaPlayer
    MediaPlayer mp = new MediaPlayer();
    DatabaseHandler db = new DatabaseHandler(this);
    Entry retrieveEntry = new Entry();

    retrieveEntry = db.getEntry();

    List<String> path = retrieveEntry.getAudioUri();

    path.size();

    System.out.println("PATH SIZE: " +path.size());

    System.out.println("FILEZ: " + path);

    Iterator<String> i = path.iterator();
    String myAudio;
    int count = 0;

    while (i.hasNext()) {
        System.out.println(count);
            myAudio = i.next();
            System.out.println("MY AUDIO: " + myAudio);

            MediaPlayer player = MediaPlayer.create(this, Uri.parse(myAudio));
            player.start();
            player.stop();
            player = MediaPlayer.create(this, Uri.parse(myAudio));
            player.start();

            count++;
        }
}

私のユーザーは、ファイルを再生するためのユーザー入力が必要です。最初のファイルを再生し、ユーザーがボタンを押すのを待ってから、2 番目のファイルを再生し、ユーザーがボタンを押すのを待つなどの方法はありますか? .? 現時点では、再生ボタンが押されると、返されたすべてのサウンド ファイルが次々に再生されるのではなく、同時に再生されます。

提供されたヘルプに事前に感謝します!

4

2 に答える 2

2

このクラスを使用して、プレイリストを再生できます。これにより、1 つのオーディオが開始され、そのオーディオが終了すると、リストの最後まで次のオーディオの再生が開始されます。プレイリストをループで再生したい場合、つまり最後に到達した後に最初のオーディオを開始する場合は、 isLooping=true を渡しますstartPlayingPlaylist(list,looping)

    AudioPlayer player = new AudioPlayer();
    player.startPlayingPlaylist(list, false);

クラス

public class AudioPlayer{
    MediaPlayer player = null;
    ArrayList<String> playlist = null;
    int position = 0;

    public AudioPlayer() {
        super();
        // TODO Auto-generated constructor stub
    }
    public void startPlayingPlaylist(ArrayList<String> list, boolean looping){
        playlist = list;
        if(player!=null){
            player.release();
        }
        if(playlist!=null && playlist.size()>0){
            player = MediaPlayer.create(LMApplicaton.getInstance(),Uri.parse(playlist.get(position)));
            player.setWakeMode(LMApplicaton.getInstance(), PowerManager.PARTIAL_WAKE_LOCK);
            player.setLooping(looping);
            player.start();
            // Set onCompletion listener
            player.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    position = position+1;
                    if(position<playlist.size()){
                        try {
                            player.reset();
                            player.setDataSource(playlist.get(position));
                            player.prepareAsync();
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalStateException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    } else if(player.isLooping()==true){
                        position = position%playlist.size();
                        try {
                            player.reset();
                            player.setDataSource(playlist.get(position));
                            player.prepareAsync();
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalStateException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    else if(player.isLooping()==false){
                        player.release();
                        player = null;
                    }
                }
            });
            player.setOnPreparedListener(new OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer mp) {
                    player.start();
                }
            });
        }
    }
    public void pause(){
        if(player!=null && player.isPlaying()){
            player.pause();
        }
    }
    public void play(){
        if(player!=null && player.isPlaying()==false){
            player.start();
        }
    }
    public boolean isPlaying(){
        return player.isPlaying();
    }
    public void release(){
        if(player!=null){
            player.release();
        }
    }

}

編集: 以下のクラスはオーディオのリストを受け取り、最初のオーディオを再生します。ユーザーが呼び出したときに次のオーディオを再生startNextAudio()します。要件に応じて、これらのいずれかを使用できます。

public class AudioPlayer{ MediaPlayer プレーヤー = null; ArrayList プレイリスト = null; int 位置 = 0;

public AudioPlayer() {
    super();
    // TODO Auto-generated constructor stub
}
public void startPlayingPlaylist(ArrayList<String> list){
    playlist = list;
    if(player!=null){
        player.release();
    }
    if(playlist!=null && playlist.size()>0){
        player = MediaPlayer.create(LMApplicaton.getInstance(),Uri.parse(playlist.get(position)));
        player.setWakeMode(LMApplicaton.getInstance(), PowerManager.PARTIAL_WAKE_LOCK);
        player.start();
        // Set onCompletion listener
        player.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                player.start();
            }
        });
    }
}
public void startNextAudio(){
    position = position+1;
    if(position<playlist.size()){
        try {
            player.reset();
            player.setDataSource(playlist.get(position));
            player.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    } else if(player.isLooping()==true){
        position = position%playlist.size();
        try {
            player.reset();
            player.setDataSource(playlist.get(position));
            player.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else{
        Log.i("AudioPlayer","Playlist reached at the end");
    }
}
public void pause(){
    if(player!=null && player.isPlaying()){
        player.pause();
    }
}
public void play(){
    if(player!=null && player.isPlaying()==false){
        player.start();
    }
}
public boolean isPlaying(){
    return player.isPlaying();
}
public void release(){
    if(player!=null){
        player.release();
    }
}

}

于 2012-04-15T14:58:39.053 に答える
1

1 つの方法は、MediaPlayer.OnCompletionListener インターフェイスを実装することです。これにより、次のように使用できる MediaPlayer.onCompletion() コールバック メソッドが提供されます。

@Override
public void onCompletion(MediaPlayer mp) {
  if (i.hasNext) {
    // ...hand mp the next file
    // ...show the user the 'play next' button
  }
}

MediaPlayer.setOnCompletionListener()また、セットアップでメソッドを呼び出す必要があることに注意してください。

于 2012-04-15T15:05:58.097 に答える