Android MediaRecorder 录制自己循环回

Android MediaRecorder recording looping back on itself

我制作了一个使用 MediaRecorder 和 MediaPlayer 的应用程序,但是每当我录制并播放它时,它都会自行循环。

例如我说,一、二、三、四、五、六、七、八、九、十

但它播放为一、二、三、三、四、五、五、五等。如果录制时间更长,情况会变得更糟吗?

这可能是一个简单的错误,但我没有看到它。

这是我的代码:

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.CountDownTimer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.Switch;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

Switch switchPlay;
Button btnRecord, btnDelete;
ProgressBar pBarMetronome;

MediaRecorder mRecorder1, mRecorder2, mRecorder3, mRecorder4, mRecorder5, mRecorder6;
MediaPlayer mp1, mp2, mp3, mp4, mp5, mp6;

String sdPath = "/sdcard/Looper Recordings/";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    switchPlay = (Switch)findViewById(R.id.switchPlay);
    btnRecord = (Button)findViewById(R.id.buttonRecord);
    btnDelete = (Button)findViewById(R.id.buttonDelete);

    pBarMetronome = (ProgressBar)findViewById(R.id.progressBarMetronome);

    clearFile();
    createFile();
    lineOne();
}

private void playOne(){
    mp1 = new MediaPlayer();
    Uri myUri = Uri.parse("/sdcard/Looper Recordings/one.mp3");
    mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mp1.setDataSource(getApplicationContext(), myUri);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mp1.prepare();
        Toast.makeText(MainActivity.this, "preparing", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
    }

    mp1.start();
    Toast.makeText(MainActivity.this, "play!", Toast.LENGTH_SHORT).show();
}

private void recordOne(){
    mRecorder1 = new MediaRecorder();
    mRecorder1.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder1.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mRecorder1.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mRecorder1.setOutputFile(sdPath+"one.mp3");
    //mRecorder1.setAudioEncoder(MediaRecorder.getAudioSourceMax());
    mRecorder1.setAudioEncodingBitRate(16);
    mRecorder1.setAudioSamplingRate(44100);
    try {
        mRecorder1.prepare();
        Toast.makeText(MainActivity.this, "preparing...", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
    }
            Toast.makeText(MainActivity.this, "starting...", Toast.LENGTH_SHORT).show();
            mRecorder1.start();

            new CountDownTimer(5000,1000){
                @Override
                public void onTick(long millisUntilFinished) {

                }

                @Override
                public void onFinish() {
                    mRecorder1.stop();
                    Toast.makeText(MainActivity.this, "Stopped!", Toast.LENGTH_SHORT).show();
                }
            }.start();
}

private void lineOne(){
    btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            recordOne();

        }
    });
    btnRecord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new CountDownTimer(4000,1000){
                @Override
                public void onTick(long millisUntilFinished) {
                    btnRecord.setText(""+(millisUntilFinished/1000));
                    playOne();
                }

                @Override
                public void onFinish() {

                }
            }.start();

        }
    });
    switchPlay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                //ON



            }else{
                //OFF


            }
        }
    });
}

private void clearFile(){
    File dir = new File(Environment.getExternalStorageDirectory()+"/sdcard/Looper Recordings");
    if (dir.isDirectory())
    {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++)
        {
            new File(dir, children[i]).delete();
        }
    }
}

private void createFile(){
    File recordingDirectory = new File(Environment.getExternalStorageDirectory()+ File.separator+"Looper Recordings");

    if(!recordingDirectory.exists() && !recordingDirectory.isDirectory())
    {
        // create empty directory
        if (recordingDirectory.mkdirs())
        {
            Toast.makeText(MainActivity.this, "Folder for recordings created!", Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(MainActivity.this, "Folder for recordings could not be created?", Toast.LENGTH_SHORT).show();
        }
    }
    else
    {
    }
}
}

我知道这很乱,但我仍在制作原型

感谢所有愿意提供帮助的人!

您似乎多次初始化 MediaPlayer 并同时播放它们

你试过设置循环为假吗

private void playOne(){
if(mp1 != null && mp1.isPlaying()){
{
    mp1.stop();
}
mp1 = new MediaPlayer();
mp1.setLooping(false);
Uri myUri = Uri.parse("/sdcard/Looper Recordings/one.mp3");
mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
    mp1.setDataSource(getApplicationContext(), myUri);
} catch (IOException e) {
    e.printStackTrace();
}
try {
    mp1.prepare();
    Toast.makeText(MainActivity.this, "preparing", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    e.printStackTrace();
}

mp1.start();
Toast.makeText(MainActivity.this, "play!", Toast.LENGTH_SHORT).show();
}