相继在A​​ndroid的播放声音文件中的一个 [英] Play sound file one after another in android

查看:100
本文介绍了相继在A​​ndroid的播放声音文件中的一个的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从RES /原始文件夹后播放声音的机器人之一。但是它只能播放来自声阵列的第一个声音。是否有任何其他的方式来做到这一点?

有一个在原始文件夹中的三音文件

  

1.aa.ogg   2.ma.ogg   3.ar.ogg

 包com.protonray.calculatorplus;
进口的java.util.List;
进口android.media.MediaPlayer;
进口android.media.MediaPlayer.OnCompletionListener;
进口android.os.Bundle;
进口android.view.View;
进口android.widget.Button;
进口android.widget.EditText;
进口android.app.Activity;


    公共类LayoutNew延伸活动{
        诠释计数= 0;
        INT []声音= {R.raw.aa,R.raw.ma,R.raw.ar};
        MediaPlayer的熔点为新的MediaPlayer();

    @覆盖
        保护无效的onCreate(包savedInstanceState){
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.layout_new);
            按钮播放=(按钮)findViewById(R.id.play);
            play.setOnClickListener(新View.OnClickListener(){

                @覆盖
                公共无效的onClick(查看为arg0){
                    // TODO自动生成方法存根
                    计数= 0;
            //播放弗里斯特声音
                    MP = MediaPlayer.create(LayoutNew.this,听起来[计数]);
                    mp.start();
                    数= 1;
                }
            });





mp.setOnCompletionListener(新OnCompletionListener(){
                    @覆盖
                    公共无效onCompletion(MediaPlayer的MP){
                        // TODO自动生成方法存根
                        如果(计数3;){
                            mp.stop();
//播放下一声音
                            MP = MediaPlayer.create(LayoutNew.this,听起来[计数]);
                            mp.start();
                            算上++;
                        }
                    }
                });
            }

        }
 

解决方案

看一看<一href="http://developer.android.com/reference/android/media/MediaPlayer.html#setNextMediaPlayer%28android.media.MediaPlayer%29"相对=nofollow> setNextMediaPlayer 。这应该完成你所需要的。

只需创建的onClick 3媒体播放器(每个声音文件),然后设置下一个球员为前两个文件的下一个文件的播放器,例如:

  play.setOnClickListener(新View.OnClickListener(){
    @覆盖
    公共无效的onClick(查看为arg0){
       对于(INT SND = 0; SND 3;; SND ++){
          MP [声音] = MediaPlayer.create(LayoutNew.this,音[声音]);
       }
       对于(INT SND = 0; SND 2,SND ++){
          MP [声音] .setNextMediaPlayer(MP [SND + 1]);
       }
    );
 

您应该也释放,当他们完成(通过调用发布()在他们每个人的)所有3个媒体播放器。这很容易通过添加一个 onCompletion 处理程序的最后一个媒体播放器的(即 MP [2] ),以便它一旦所有3声音已完成播放清理。


编辑,因为你需要的API 8,你可以用你现在做的方法,但你必须设置 OnCompletionListener 为第一和第二的声音,目前它只会触发时第一个完成,而不是第二个。试试这个code:

  MediaPlayer的熔点;

play.setOnClickListener(新View.OnClickListener(){

   @覆盖
   公共无效的onClick(查看为arg0){
      熔点= MediaPlayer.create(LayoutNew.this,声音[0]);
      mp.start();
      mp.setOnCompletionListener(新OnCompletionListener(){
         @覆盖
         公共无效onCompletion(MediaPlayer的MP){
            mp.dispose();
            熔点= MediaPlayer.create(LayoutNew.this,声音[1]);
            mp.start();
            mp.setOnCompletionListener(新OnCompletionListener(){
               @覆盖
               公共无效onCompletion(MediaPlayer的MP){
                  mp.dispose();
                  熔点= MediaPlayer.create(LayoutNew.this,声音[2]);
                  mp.start();
                  mp.setOnCompletionListener(新OnCompletionListener(){
                     公共无效onCompletion(MediaPlayer的MP){
                        mp.dispose();
                        熔点=无效;
                     }
                  });
               }
            });
         }
      });
   }
}
 

我没有测试code,但它应该工作。从此带走关键的事情是,你需要调用 setOnCompletionListener 创建一个新的MediaPlayer,使新的实例将通知您,当它完成各一次。

此外,因为你设置的一切在的onClick (一次全部)​​,您不需要使用计数器,除非你真的想要,或者有一些其他的好理由吧。无论哪种方式,这应该足以说明你在做什么错了,该怎么办呢,这样它的工作原理。

I am trying to play sound in android one after from "res/raw" folder. But it is only playing the first sound from sounds array. is there any other way to do it?

There is three sound file in raw folder

1.aa.ogg 2.ma.ogg 3.ar.ogg

package com.protonray.calculatorplus;    
import java.util.List;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;    
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;


    public class LayoutNew extends Activity{
        int count=0;
        int[] sounds={R.raw.aa,R.raw.ma,R.raw.ar };
        MediaPlayer mp=new MediaPlayer();

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layout_new);        
            Button play=(Button) findViewById(R.id.play);       
            play.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    count =0 ;
            //Play the Frist sound
                    mp =MediaPlayer.create(LayoutNew.this,sounds[count]);               
                    mp.start();
                    count =1 ;          
                }
            });





mp.setOnCompletionListener(new OnCompletionListener() {         
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        if(count<3){                    
                            mp.stop();
//Play next sound                   
                            mp =MediaPlayer.create(LayoutNew.this,sounds[count]);
                            mp.start();
                            count++;
                        }
                    }
                });
            }

        }

解决方案

Have a look at setNextMediaPlayer. That should accomplish what you need.

Simply create 3 media players (one for each sound file) in onClick and then set the next player for the first two files to the next file's player, for example:

play.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
       for ( int snd = 0; snd < 3; snd++ )  {
          mp[snd] = MediaPlayer.create( LayoutNew.this, sounds[snd] );               
       }
       for ( int snd = 0; snd < 2; snd++ )  {
          mp[snd].setNextMediaPlayer( mp[snd+1] );
       }           
    );

You should also release all 3 media players when they complete (by calling release() on each of them). This could be done easily by adding an onCompletion handler to the LAST media player ONLY (i.e. mp[2]), so that it does the cleanup once all 3 sounds have completed playing.


Edit, since you require API 8, you can use the method you do currently, but you will have to set the OnCompletionListener for both the first AND second sounds, currently it will only trigger when the first one finishes, not the second one. Try this code:

MediaPlayer mp;

play.setOnClickListener( new View.OnClickListener() {

   @Override
   public void onClick(View arg0) {
      mp = MediaPlayer.create( LayoutNew.this, sounds[0] );
      mp.start();
      mp.setOnCompletionListener( new OnCompletionListener() {
         @Override
         public void onCompletion(MediaPlayer mp) {
            mp.dispose();
            mp = MediaPlayer.create( LayoutNew.this, sounds[1] );
            mp.start();
            mp.setOnCompletionListener( new OnCompletionListener() {
               @Override
               public void onCompletion(MediaPlayer mp) {
                  mp.dispose();
                  mp = MediaPlayer.create( LayoutNew.this, sounds[2] );
                  mp.start();
                  mp.setOnCompletionListener( new OnCompletionListener() {
                     public void onCompletion(MediaPlayer mp) {
                        mp.dispose();
                        mp = null;
                     }
                  });
               }
            });
         }
      });
   }
}

I did not test this code, but it should work. The key thing to take away from this is that you need to call setOnCompletionListener each time you create a new MediaPlayer, so that the new instance will notify you when it completes.

Also, because you are setting everything up in onClick (all at once) you do not need to use a counter unless you really want to, or have some other good reason for it. Either way, this should illustrate sufficiently what you were doing wrong and how to do it so that it works.

这篇关于相继在A​​ndroid的播放声音文件中的一个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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