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: Только исходный поток, создавший иерархию представлений, может касаться ее представлений.

Я искал вокруг, но я не могу найти исчерпывающий пример... только примеры с большим количеством вещей и классов, которые мне не нужны. я могу исправить эту проблему?


person Zak    schedule 29.11.2012    source источник


Ответы (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());
}
person sdabet    schedule 29.11.2012
comment
спасибо, я понял эту вещь. но теперь он выдает новые ошибки: dl.dropbox.com/u/16047047/log. txt logcat не настолько исчерпывающий... - person Zak; 29.11.2012
comment
что находится в строке 29 Noise.java? - person sdabet; 29.11.2012
comment
строка risultato, которую вы мне написали - person Zak; 29.11.2012
comment
Как называется ваш XML-файл макета? Вам нужно загрузить его в метод onCreate вашей активности с помощью setContentView - person sdabet; 29.11.2012
comment
нууу невероятно! я пропустил это :-D опс ахахах спасибо, это работает. теперь мне нужно знать, почему он всегда возвращает 0, даже если я кричу в микрофон :-| - person Zak; 29.11.2012
comment
Конечно. у вас есть идеи для 0? - person Zak; 29.11.2012
comment
Это может быть полезно: stackoverflow.com/questions/6600364/ - person sdabet; 29.11.2012
comment
мпф... эта часть сложная. я не могу понять. он вылетает, говоря, что запуск вызывается в недопустимом состоянии 4 - person Zak; 29.11.2012
comment
прочитайте это: developer.android.com/reference/android/media/ - person sdabet; 29.11.2012