我正在创建一个Android应用程序来记录我的应用程序中的声音。我不明白为什么它不起作用。我能够做好准备然后开始“工作”或者至少没有崩溃然后我陷入了停止问题()。我重建了我的代码,现在它在start()时遇到了问题。我相信我准备的媒体记录是错误的。
package com.example.kyle.slap08;
import android.media.AudioManager;
import android.media.MediaRecorder;
import android.media.SoundPool;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
public class Drum extends AppCompatActivity {
MediaRecorder rec;
String mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
boolean recording = false;
boolean loaded =false;
Button bass;
Button snare;
Button kick;
Button shake;
Button clap;
@Override
protected void onCreate(Bundle savedInstanceState) {
rec = new MediaRecorder();
rec.setAudioSource(MediaRecorder.AudioSource.MIC);
rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
rec.setOutputFile(mFileName + "track1"); //change to different output files
try {
rec.prepare();
} catch (IOException e) {
e.printStackTrace();
}
final SoundPool sp = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
final int bassID = sp.load(this, R.raw.deep, 1);
final int snareID = sp.load(this, R.raw.snare, 1);
final int kickID = sp.load(this, R.raw.kick, 1);
final int shakeID = sp.load(this, R.raw.shake, 1);
final int clapID = sp.load(this, R.raw.clap, 1);
final int heyID = sp.load(this, R.raw.hey, 1);
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
Float actVolume = (float) am.getStreamVolume(AudioManager.STREAM_MUSIC);
Float maxVolume = (float) am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
final Float volume = actVolume/maxVolume;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drum);
sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
loaded = true;
}
});
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
bass = (Button) findViewById(R.id.bass);
snare = (Button) findViewById(R.id.snare);
kick = (Button) findViewById(R.id.kick);
shake = (Button) findViewById(R.id.shake);
clap = (Button) findViewById(R.id.clap);
Button hey = (Button) findViewById(R.id.hey);
bass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.play(bassID, volume, volume, 1, 1, 1f);
}
});
snare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.play(snareID, volume, volume, 1, 1, 1f);
}
});
kick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.play(kickID, volume, volume, 1, 1, 1f);
}
});
shake.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.play(shakeID, volume, volume, 1, 1, 1f);
}
});
clap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.play(clapID, volume, volume, 1, 1, 1f);
}
});
hey.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.play(heyID, volume, volume, 1, 1, 1f);
}
});
} //END OF ONCREATE
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_drum, menu);
return true;
}
protected void recordToggle(){
if(recording == true){
recording = false;
rec.stop();
//rec.reset();
//rec.release();
Toast t = Toast.makeText(getApplicationContext(), "Recoding Off", Toast.LENGTH_SHORT);
t.show();
} else {
recording = true;
rec.start();
Toast t = Toast.makeText(getApplicationContext(), "Recoding On", Toast.LENGTH_SHORT);
t.show();
}
}
protected void playBack(){
Toast t = Toast.makeText(getApplicationContext(), "Playback", Toast.LENGTH_SHORT);
t.show();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch(id){
case R.id.action_record:
recordToggle();
return true;
case R.id.action_play:
playBack();
return true;
}
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}//end of activity
答案 0 :(得分:0)
好吧所以我解决了我的问题,第一件事是stop()故意抛出一个异常所以你必须抓住它:
try {
rec.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
Toast t = Toast.makeText(getApplicationContext(), "Recoding Off", Toast.LENGTH_SHORT);
t.show();
}
第二,可能是我收到状态无效错误的最大原因是,我的输出文件一点也不正确,所以我评论了它,现在它工作正常! 因此,如果您遇到类似的问题,我建议在google android网站上查看mediarecord的生命周期图表。然后查找如何正确设置输出文件。