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());
}
Другие вопросы по тегам