我是新开发者。 我想通过按住按钮录制声音,我想用媒体播放器类播放。
我的SD卡中有一个文件夹,我录制的所有声音都保存在其中。 当我点击播放按钮时,会播放最后保存的声音文件或修改后的声音。
错误1:当我点击nextbtn时,我的应用程序被强制关闭。
java.lang.IllegalStateException 在android.media.MediaPlayer.prepare(本机方法) 在com.example.mehrdad.calendar.Event $ 4.onClick(Event.java:201) 在android.view.View.performClick(View.java:4103) 在android.view.View $ PerformClick.run(View.java:17117) 在android.os.Handler.handleCallback(Handler.java:615) 在android.os.Handler.dispatchMessage(Handler.java:92) 在android.os.Looper.loop(Looper.java:137) 在android.app.ActivityThread.main(ActivityThread.java:4744) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:511) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在dalvik.system.NativeStart.main(本地方法)
错误2:当我释放recordbtn时,我的停止功能未被调用。
这是我在oncreate方法中的代码
File adr = new File(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]+"/voice");
File[] files = adr.listFiles();
if (!(files == null || files.length == 0)) {
File lastModifiedFile = files[0];
for (int i = 0; i < files.length; i++) {
playlist.add(files[i].getAbsolutePath());
if (lastModifiedFile.lastModified() < files[i].lastModified()) {
currentTrack=i;
myfile=Uri.parse(playlist.get(currentTrack));
}
}
mp = MediaPlayer.create(Event.this,myfile);
i=1;
}
btnPlay= (Button) findViewById(R.id.play);
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(i==1) {
try {
if (mp.isPlaying()) {
mp.pause();
}
mp.start();
} catch (Exception e) {
e.printStackTrace();
}
}
if(i==0)
Toast.makeText(getApplicationContext(),"No sound to play",Toast.LENGTH_LONG).show();
}
});
btnNextVoice= (Button) findViewById(R.id.nextVoice);
btnNextVoice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mp.isPlaying()) {
mp.stop();
}
currentTrack=(currentTrack+1)%playlist.size();
myfile=Uri.parse(playlist.get(currentTrack));
mp=MediaPlayer.create(Event.this,myfile);
try {
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
} mp.start();
}
});
btnLastVoice= (Button) findViewById(R.id.lastVoice);
btnLastVoice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mp.isPlaying()) {
mp.stop();
}
currentTrack=(currentTrack-1)%playlist.size();
myfile=Uri.parse(playlist.get(currentTrack));
try {
mp.setDataSource(Event.this,myfile);
} catch (IOException e) {
e.printStackTrace();
}
try {
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
}
});
btnStart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final Date date = new Date();
final SimpleDateFormat dateFormat = new SimpleDateFormat("HH-mm-ss");
final File dir;
Boolean canWrite = Environment.getExternalStorageDirectory().canWrite();
if (canWrite) {
dir = new File(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
} else {
dir = new File(Environment.getRootDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
}
dir.mkdirs();
myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(String.valueOf(dir) + "/" + dateFormat.format(date) + ".amr");
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:{
start();
break;
}
case MotionEvent.ACTION_UP:{
stop();
break;
}
}
return false;
}
});
stop()和start()函数:
private void stop() {
myRecorder.stop();
myRecorder.reset();
myRecorder.release();
myRecorder = null;
Toast.makeText(getApplicationContext(), "Stop recording...",Toast.LENGTH_SHORT).show();
}
private void start() {
try {
myRecorder.prepare();
myRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), "Start recording...",
Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:1)
问题1:
您正在已准备好的MediaPlayer上调用prepare()
。有关详细信息,请参阅documentation。
问题2:
在致电start()
之前,您也可以在致电stop()
之前创建新的MediaRecorder。您应该将此代码块从onTouch()
移到start()
:
final Date date = new Date();
final SimpleDateFormat dateFormat = new SimpleDateFormat("HH-mm-ss");
final File dir;
Boolean canWrite = Environment.getExternalStorageDirectory().canWrite();
if (canWrite) {
dir = new File(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
} else {
dir = new File(Environment.getRootDirectory() + "/myFolder" + "/" + mDate[2] + "-" + mDate[1] + "-" + mDate[0]);
}
dir.mkdirs();
myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(String.valueOf(dir) + "/" + dateFormat.format(date) + ".amr");