Android: запись децибела с микрофона
У меня проблема с реализацией этой функциональности в Android... мне нужно только вывести децибел, перезаписанный с микрофона, и это вещь, которую я не могу понять:
public class Noise extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
MediaRecorder recorder=new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Timer timer=new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 500);
}
private class RecorderTask extends TimerTask{
TextView risultato=(TextView) findViewById(R.id.risultato_recorder);
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder){
this.recorder = recorder;
}
public void run(){
risultato.setText(""+recorder.getMaxAmplitude());
}
}
}
В текстовом представлении результат печатается только в первый раз, и он равен 0, а затем происходит сбой приложения с: 11-29 14:43:27.133: E/AndroidRuntime(25785): android.view.ViewRoot$CalledFromWrongThreadException: только оригинальный поток, создавший иерархию представлений, может касаться его представлений.
Я искал, но не могу найти исчерпывающий пример... только примеры с большим количеством вещей и классов, которые мне не нужны. я могу решить эту проблему?
1 ответ
Компоненты пользовательского интерфейса могут быть изменены только из потока пользовательского интерфейса.
Ваша задача выполняется в фоновом потоке, поэтому вам нужно TextView
обновление должно быть сделано в потоке пользовательского интерфейса. Вы можете достичь этого с Activity.runOnUiThread
метод.
Попробуй это:
public void run(){
runOnUiThread(new Runnable() {
@Override
public void run() {
risultato.setText("" + recorder.getMaxAmplitude());
}
});
}
вместо
public void run(){
risultato.setText(""+recorder.getMaxAmplitude());
}