循环使用原始的音乐阵列的android阵列、原始、音乐、android

2023-09-05 10:23:26 作者:新欢YU旧爱

目前我正在试图创建一个for循环将在其中扮演一个原始文件,当它的完成,将进入到阵列中的下一个声音文件。这是当前正在播放的所有文件一次。任何建议,我怎么能解决这个问题?我觉得可能是在完成听众的问题,但不能肯定。谢谢。

我的code:

 包com.example.mediatest;



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



    MediaPlayer的熔点为新的MediaPlayer();



   为(中间体y = 0的; Y 3;; Y ++){
       MP = MediaPlayer.create(这一点,myMusic [Y]);
       mp.start();
       mp.setOnCompletionListener(新OnCompletionListener(){

        @覆盖
        公共无效onCompletion(MediaPlayer的MP){
            // TODO自动生成方法存根

        }

       });
   }
 

解决方案

您可以创建单独的MediaPlayer对象,开始的第一个,然后在 onCompletion 开始下。一个解决方案,扩展,试试这个:

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

MediaPlayer的熔点= MediaPlayer.create(此,myMusic [0]);

mp.setOnCompletionListener(新OnCompletionListener(){
    @覆盖
    公共无效onCompletion(MediaPlayer的MP){
        mCompleted ++;
        mp.reset();
        如果(mCompleted&其中; myMusic.length()){
            尝试 {
                AssetFileDescriptor AFD = getResources()openRawResourceFd(myMusic [mCompleted])。
                如果(AFD!= NULL){
                    mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                    afd.close();
                    MP prepare()。
                }
            }赶上(例外前){
                //报告崩溃
            }
        } 其他 {
            //用媒体播放器进行
            mp.release();
            熔点=无效;
        }
    }
});

mp.start();
 
几乎是史上最全最实用的Android性能全面分析与优化方案研究

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

  INT [] myMusic = {R.raw.caralarm,R.raw.phonebusysignal,R.raw.phoneoffhook};
INT mNext;
OnCompletionListener mListener =新OnCompletionListener(){
    @覆盖
    公共无效onCompletion(MediaPlayer的MP){
        mp.release();
        startNextFile();
    }
};

@覆盖
公共无效的onCreate(){
    //这里平时的onCreate的东西,然后......

    //不是在这里,只要你想启动序列
    mNext = 0;
    startNextFile();
}

无效startNextFile(){
    如果(mNext< myMusic.length){
        MediaPlayer的MP = MediaPlayer.create(这一点,myMusic [mNext ++]);
        mp.setOnCompletionListener(mListener);
        mp.start();
    }
}
 

I am currently trying to create a for loop in which it will play a raw file and when it's done, it will go on to the next sound file in the array. It is currently playing all files at once. Any suggestions as to how i could fix this? I think there might be a problem with the on completion listener, but not sure. Thanks.

my Code:

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

        }

       });
   }

解决方案

You can create separate MediaPlayer objects, start the first and then in onCompletion start the next. For a solution that scales, try this instead:

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();

A simpler approach (slightly more wasteful of resources) is:

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();
    }
}