1

我不知道为什么,但是 start() 方法会引发错误并使应用程序崩溃:

public class Noise extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.noise);
    MediaRecorder recorder=new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    try{
        recorder.prepare();
    }catch(IllegalStateException e){
        Log.d("Error",e.toString());
        e.printStackTrace();
    }catch(IOException e){
        Log.d("Error",e.toString());
        e.printStackTrace();
    }
    recorder.start();
    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(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                risultato.setText("" + recorder.getMaxAmplitude());
            }
        });
    }
}
}

如果我删除准备和开始,它可以工作,但在文本视图中总是返回 0。任何人都可以帮助我吗?这件事让我发疯

这是日志猫:https ://dl.dropbox.com/u/16047047/log.txt

在电话中,它崩溃了。

4

3 回答 3

3

看来你错过了recorder.setOutputFile(PATH_NAME);查看文档MediaRecorder

至少,这是堆栈跟踪告诉我们的:

11-29 16:04:08.933: W/System.err(9323): java.io.IOException: No valid output file

这是相关的源代码MediaRecorder.prepare()

public void prepare() throws IllegalStateException, IOException
{
    if (mPath != null) {
        FileOutputStream fos = new FileOutputStream(mPath);
        try {
            _setOutputFile(fos.getFD(), 0, 0);
        } finally {
            fos.close();
        }
    } else if (mFd != null) {
        _setOutputFile(mFd, 0, 0);
    } else {
        throw new IOException("No valid output file");
    }
    _prepare();
}

(您可以在 grepcode 上阅读File)如果object 和FileDescriptorare都将引发异常null。所以我认为你不能MediaRecorder在不提供文件的情况下使用。您可以尝试棘手的/dev/null但我不知道它是否有效,并且现在无法测试

于 2012-11-29T15:10:19.217 回答
1

看起来您调用start()了两次,一次在 ActivityonCreate()中,一次在 RecorderTask 构造函数中。你应该只需要一个。如果不知道它是如何崩溃的——就像堆栈跟踪一样——很难知道更多。

于 2012-11-29T14:59:52.363 回答
1

mediaRecoder.setOutputFormat(value)检查此帖子https://stackoverflow.com/a/372​​32920/3533092可能会发生类似问题

于 2016-05-14T23:30:11.333 回答