首先是一个简短的介绍。我需要制作一个可以准确记录声音的应用程序。要求是我制作一个应用程序,该应用程序每毫秒记录10个或更多样本。
编辑:处理程序的初始化。
public class MyApp extends AppCompatActivity {
<Initialize everything>
Handler handler= new Handler();
}
我有一个开始按钮,需要做一些事情,最后它需要测量我的声音水平。
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
<intitializing sound stuff>
handler.post(updateSoundLevel);
}
});
这转到以下循环。
@Override
protected void onCreate(Bundle savedInstanceState) {
<Initialize buttons and some variables>
final Runnable updateSoundLevel = new Runnable() {
@Override
public void run() {
if (SoundRecording==true)
{
handler.post(this);
<here is measure the time and amplitude>
}
}
};
};
问题是我无法在运行时按下“停止录制”按钮。将此选项更改为:handler.postdelayed(updateSoundLevel, 1)
是不可行的,因为这会使整个过程减慢1毫秒,这意味着我每毫秒无法获取10个样本。
如果我使用handler.postdelayed(this,1)
,我实际上可以使程序正常工作。而且我可以停止录音。
buttonStop.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
//Stop mediarecorder
try
{
mediaRecorder.setOnErrorListener(null);
mediaRecorder.setOnInfoListener(null);
mediaRecorder.setPreviewDisplay(null);
mediaRecorder.stop();
mediaRecorder.release();
}
catch (IllegalStateException e)
{ <error message> }
catch (RuntimeException e)
{ <error message> }
catch (Exception e)
{ <error message> }
<Code to draw a graph, ...>
}
});