2017-01-11 27 views
1

我製作了一個應用程序,它使用MediaRecorder和MediaPlayer,但每當我錄製內容並播放它時,它都會自行循環播放。Android MediaRecorder錄製回放本身

如我說,一,二,三,四,五,六,七,八,九,十

但回放一,二,三三,四四,555等如果錄製時間更長,它會變得更糟?

這可能是一個簡單的錯誤,但我沒有看到它。

這裏是我的代碼:

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 
    { 
    } 
} 
} 

我知道這是很混亂,但我仍然原型

由於任何人誰願意幫助!

回答

1

似乎要初始化的MediaPlayer多次和simeltenously發揮他們

+0

我在做什麼? –

+0

每次您在方法的第一行中致電playOne時 – user2310252

+0

謝謝!我想我明白你的意思了!我把playOne放在onTick()而不是onFinish()中。謝謝你的幫助! –

1

你有沒有嘗試設置循環假。

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

謝謝!我試過,但它仍然有同樣的問題:( –

+0

你試圖在初始化之前停止它嗎? –

+1

我想通了!謝謝你的幫助! –

相關問題