for循环使用原始音乐数组android

问题描述 投票:1回答:4

我目前正在尝试创建一个for循环,在该循环中它将播放原始文件,完成后将继续播放数组中的下一个声音文件。当前正在一次播放所有文件。关于如何解决此问题的任何建议?我认为完成监听器可能存在问题,但不确定。谢谢。

我的代码:

package com.example.mediatest;



    int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};



    MediaPlayer mp = new MediaPlayer();



   for (int y =0; y<3; y++){
       mp = MediaPlayer.create(this, myMusic[y]);
       mp.start();
       mp.setOnCompletionListener(new OnCompletionListener(){

        @Override
        public void onCompletion(MediaPlayer mp) {
            // TODO Auto-generated method stub

        }

       });
   }
android arrays for-loop media-player
4个回答
5
投票

您可以创建单独的MediaPlayer对象,首先启动,然后在onCompletion中启动下一个。对于可扩展的解决方案,请尝试以下方法:

int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
int mCompleted = 0;

MediaPlayer mp = MediaPlayer.create(this, myMusic[0]);

mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mCompleted++;
        mp.reset();
        if (mCompleted < myMusic.length()) {
            try {
                AssetFileDescriptor afd = getResources().openRawResourceFd(myMusic[mCompleted]);
                if (afd != null) {
                    mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                    afd.close();
                    mp.prepare();
                }
            } catch (Exception ex) {
                // report a crash
            }
        } else {
            // done with media player
            mp.release();
            mp = null;
        }
    }
});

mp.start();

一种更简单的方法(稍微浪费资源)是:

int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
int mNext;
OnCompletionListener mListener = new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.release();
        startNextFile();
    }
};

@Override
public void onCreate() {
    // usual onCreate stuff here, then...

    // either here or whenever you want to start the sequence
    mNext = 0;
    startNextFile();
}

void startNextFile() {
    if (mNext < myMusic.length) {
        MediaPlayer mp = MediaPlayer.create(this, myMusic[mNext++]);
        mp.setOnCompletionListener(mListener);
        mp.start();
    }
}

1
投票

这是在继续循环中播放歌曲的有效代码。

public class MainActivity extends Activity 
{
private int[] tracks = {R.raw.explosion,R.raw.pianothingy_one,R.raw.car_horn_x};
int mCompleted = 0;

public void onCreate(Bundle savedInstanceState) 
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 MediaPlayer mp = MediaPlayer.create(this, tracks[0]);
 mp.setOnCompletionListener(new OnCompletionListener() 
 {
     @Override
     public void onCompletion(MediaPlayer mp)
     {
         mCompleted++;
         mp.reset();
         if (mCompleted < tracks.length) 
         {
             try
             {
                 AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
                 if (afd != null) 
                 {
                     mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                     afd.close();
                     mp.prepare();
                     mp.start();
                 }
             }
             catch (Exception ex) 
             {
                ex.printStackTrace();
             }

         } 
         else if (mCompleted>=tracks.length) 
         {
             mCompleted =0;
             try
             {
                 AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
                 if (afd != null) 
                 {
                     mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                     afd.close();
                     mp.prepare();
                     mp.start();
                 }
             }
             catch (Exception ex) 
             {
                ex.printStackTrace();
             }
         }
         else
         {
             mCompleted=0;
              mp.release();
              mp = null;
         }

     }
 });

 mp.start();

0
投票

鉴于您只有3个,因此创建一个MediaPlayers数组会更容易。您应该只启动第一个播放器,并设置onCompletionListeners,然后在该播放器中启动下一个播放器。希望这会有所帮助。


0
投票
 int flag=0;
 int track; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_player);
    NextSongOnline()
}


public void NextSongOnLine(){
    if (flag == 0){
        track = position;
    }
    flag = 1;
    if (track == position){
        position = ((position + 1)%mySongs.size());
        Uri uri3 = Uri.parse(mySongs.get(position).toString());
        myMediaPlayer = MediaPlayer.create(getApplicationContext(),uri3);

        sname = mySongs.get(position).getName().toString();
        songTitle.setText(sname);

        myMediaPlayer.start();
        seekBar.setMax(myMediaPlayer.getDuration()/1000);

        //set End time of music
        endTimeText.setText(createTimerLabel(myMediaPlayer.getDuration()/1000));

    }
    track++;
    myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            NextSongOnLine();
            Toast.makeText(getApplicationContext(),"Auto Playing Next Song",Toast.LENGTH_SHORT).show();
        }
    });
}

}

© www.soinside.com 2019 - 2024. All rights reserved.