Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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
Java 以随机生成的模式播放一个又一个声音并暂停_Java_Android - Fatal编程技术网

Java 以随机生成的模式播放一个又一个声音并暂停

Java 以随机生成的模式播放一个又一个声音并暂停,java,android,Java,Android,我想创建一个应用程序,在我按下一个按钮后,它将生成我的模式,对于另一个按钮,它将播放这个模式-每个字母将意味着不同的声音(现在我使用莫尔斯声音)。当模式正确生成并播放声音时,声音几乎同时播放。我想这可能是因为android播放它们的速度,所以我尝试在它们之间添加silence.mp3文件(1s silence),但听起来好像所有东西都在同时播放 import android.media.MediaPlayer; import android.os.Bundle; import android.s

我想创建一个应用程序,在我按下一个按钮后,它将生成我的模式,对于另一个按钮,它将播放这个模式-每个字母将意味着不同的声音(现在我使用莫尔斯声音)。当模式正确生成并播放声音时,声音几乎同时播放。我想这可能是因为android播放它们的速度,所以我尝试在它们之间添加silence.mp3文件(1s silence),但听起来好像所有东西都在同时播放

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.Random;
public class MainActivity extends AppCompatActivity {

    Consts Cons = new Consts();
    final int patternLenght=4;
    String pattern;
    int[] soundArray=new int[patternLenght*2];
    MediaPlayer[] mp=new MediaPlayer[patternLenght*2];
    private String GeneratePattern(int lenght) {
        String patterngen = "";
        Random rand = new Random();
        for (int i = 0; i < lenght; i++) {
            int n = rand.nextInt(2); //0-1
            String temp = Cons.ALFABET[n];
            patterngen = patterngen + temp;
        }
        pattern=patterngen;
        MakeSoundArray();
        return patterngen;
    }
    private  void MakeSoundArray(){
        for (int i = 0; i < pattern.length(); i++) {
            char sound = pattern.charAt(i);
            if(sound=='A')soundArray[i]=R.raw.a_sound_morse;
            if(sound=='B')soundArray[i]=R.raw.b_sound_morse;


            soundArray[i+1]=R.raw.silence;

        }

    }

        private void PlayFile() {


        if (pattern == null)return;

            for (int i = 0; i < pattern.length(); i++) {
            mp[i]=MediaPlayer.create(MainActivity.this,soundArray[i]);

            }
            for(int i=0;i<patternLenght-1;i++){
                mp[i].setNextMediaPlayer(mp[i+1]);
            }

            for(int i=0;i<patternLenght;i++){
                mp[i].start();
            }

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        Button start = findViewById(R.id.make_pattern);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pattern = GeneratePattern(patternLenght);
                Log.i("Pattern", pattern);
            }
        });
        //Odtwarzanie patternu
        Button playpattern = findViewById(R.id.playPattern);
        playpattern.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PlayFile();
            }
        });

    }


}


我试着使用AudioManager和ToneGenerator来创建嘟嘟声,但它们仍然同时播放。我尝试使用OnCompletionListiner,但无法使用function/loop自动绑定每个模式字符。

您在
for
循环中同时启动了所有8个播放器。那么我如何才能不同时启动它们呢?我们好好想想。在上一个循环中,您使用
setNextMediaPlayer()
将所有玩家链接在一起。换句话说,当第n个MediaPlayer完成时,(n+1)个MediaPlayer启动。你不是想从mp[0]开始吗?该死,我想我想得太多了。非常感谢你的好意,这件事一直发生在我身上。玩得高兴

public class Consts {

    final String ALFABET[]={"A","B","C","D","E","F","G","H","I"};

}