循环使用原始的音乐阵列的android [英] for loop using a raw music array android

查看:125
本文介绍了循环使用原始的音乐阵列的android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前我正在试图创建一个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();
 

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

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

这篇关于循环使用原始的音乐阵列的android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆