Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中一个接一个播放声音文件_Android - Fatal编程技术网

在android中一个接一个播放声音文件

在android中一个接一个播放声音文件,android,Android,我试图在android中播放“res/raw”文件夹中的声音。但它只播放声音阵列中的第一个声音。还有别的办法吗 原始文件夹中有三个声音文件 1.aa.ogg 2.ma.ogg 3.ar.ogg package com.protonray.calculatorplus; 导入java.util.List; 导入android.media.MediaPlayer; 导入android.media.MediaPlayer.OnCompletionListener; 导入android.os.Bundl

我试图在android中播放“res/raw”文件夹中的声音。但它只播放声音阵列中的第一个声音。还有别的办法吗

原始文件夹中有三个声音文件

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

package 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;
公共类布局新扩展活动{
整数计数=0;
int[]发音={R.raw.aa,R.raw.ma,R.raw.ar};
MediaPlayer mp=新的MediaPlayer();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_new);
按钮播放=(按钮)findViewById(R.id.play);
play.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
计数=0;
//播放第一个声音
mp=MediaPlayer.create(LayoutNew.this,听起来像[count]);
mp.start();
计数=1;
}
});
mp.setOnCompletionListener(新的OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
//TODO自动生成的方法存根

如果(count仅根据您的代码判断,请尝试将您的
mp.setOnCompletionListener
放在
onClick
中。此外,我认为您不需要
mp.stop
查看一下。这应该可以满足您的需要

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

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] );
       }           
    );
我没有测试这段代码,但它应该可以工作。关键是每次创建新的MediaPlayer时都需要调用
setOnCompletionListener
,以便新实例在完成时通知您


另外,因为您正在
onClick
中设置所有内容(一次完成)除非你真的想使用计数器,或者有其他充分的理由,否则你不需要使用计数器。无论哪种方式,这都应该充分说明你做错了什么,以及如何做到这一点以使其工作。

谢谢你……它部分工作了……我已将“mp.setOnCompletionListener”放在“onclick”中它只工作一次,即只播放声音[0]和声音[1]。你能告诉我这里有什么问题吗?我个人认为你做的工作太多了,我只是在你的
onClick
方法中执行
whileloop
,然后创建一个
playSound
方法来处理MediaPLayer。伪代码:
While(在播放所有音频文件之前,它会停止整个活动。API级别8不支持setNextMediaPlayer(arg0)方法…现在我该怎么办?然后您可以使用代码中当前使用的方法,但需要做一些更改。我已将此添加到答案中:)谢谢你…实际上声音文件不是常数…它是动态的…我已经用循环函数解决了这个问题。。。。
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] );
       }           
    );
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;
                     }
                  });
               }
            });
         }
      });
   }
}