Сначала небольшое вступление.Мне нужно сделать приложение, которое записывает звук с высокой точностью.Требования в том, чтобы я сделал приложение, которое записывает со скоростью 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, ...>
}
});