для цикла с использованием необработанного музыкального массива Android - PullRequest
1 голос
/ 15 июня 2011

В настоящее время я пытаюсь создать цикл 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

        }

       });
   }

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

Вы можете создать отдельные объекты 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();
    }
}
0 голосов
/ 13 июня 2013

Это рабочий код для воспроизведения песен в цикле продолжения.

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 голосов
/ 15 июня 2011

Будет проще создать массив MediaPlayers, если у вас есть только 3 из них. Вы должны начать только первый и установить onCompletionListeners, где вы начнете следующий игрок. Надеюсь, это поможет.

...