Android:从麦克风录制分贝

时间:2012-11-29 13:51:39

标签: android microphone spl decibel

我在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());
    }
}
}

在textview中,结果仅在第一次打印,并且为0,然后应用程序崩溃: 11-29 14:43:27.133:E / AndroidRuntime(25785):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。

我一直在寻找,但我找不到一个全面的例子......只有很多我不需要的东西和课程的例子。 我能解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

只能从UI线程修改UI组件。

您的任务在后台线程中运行,因此您需要强制在UI线程中完成TextView更新。您可以使用Activity.runOnUiThread方法实现它。

试试这个:

public void run(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            risultato.setText("" + recorder.getMaxAmplitude());
        }
    });
}

而不是

public void run(){
    risultato.setText(""+recorder.getMaxAmplitude());
}