【问题标题】:android recorder start invalid state 4android记录器启动无效状态4
【发布时间】:2012-11-29 14:54:19
【问题描述】:

我不知道为什么,但是 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

在手机中,它崩溃了。

【问题讨论】:

  • start() 方法抛出的错误(堆栈跟踪)是什么?
  • 我在主要问题中添加了 logcat

标签: android audio recorder


【解决方案1】:

您似乎错过了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 上read it)如果File 对象和FileDescriptor 都是null,则抛出异常。所以我认为你不能在不提供文件的情况下使用MediaRecorder。您可以尝试棘手的/dev/null,但我不知道它是否有效,并且现在无法测试

【讨论】:

  • 但我不需要它。我只需要将 getMaxAplitude 放在 textview 中
  • 但也许该类被设计为使用输出文件。您可以尝试使用/dev/null - 抱歉我现在无法测试
  • 嗯...不,现在它让我开始失败-2147483648。等待:设备上现在可以工作了!但我必须了解输出值...似乎不是 dB
  • 那是另一个问题 ;)
【解决方案2】:

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

【讨论】:

  • 我只在onCreate()中调用,其他的被删除
【解决方案3】:

mediaRecoder.setOutputFormat(value) 可能会出现类似的问题,请查看此帖子https://stackoverflow.com/a/37232920/3533092

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多