【问题标题】:Android: record decibel from microphoneAndroid:从麦克风记录分贝
【发布时间】:2012-11-17 14:45:56
【问题描述】:

我在 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: 只有创建视图层次结构的原始线程才能触摸它的视图。

我四处搜索,但找不到一个全面的示例……只有包含很多我不需要的东西和类的示例。 我可以解决这个问题吗?

【问题讨论】:

    标签: android microphone spl decibel


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我明白这件事了。但现在它给了我新的错误:dl.dropbox.com/u/16047047/log.txt logcat 不是那么全面...
    • Noise.java 的第 29 行是什么?
    • 你写给我的那行 risultato
    • 您的布局 XML 文件的名称是什么?您需要使用 setContentView 在活动的 onCreate 方法中加载它
    • 不,难以置信!我错过了:-D ops ahahah 谢谢,它工作。现在我需要知道为什么它总是返回 0,如果我对着麦克风尖叫:-|
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2019-04-01
    • 2014-11-23
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多