2012-11-29 13 views
1

我不硝酸钾为什么,但在start()方法抛出一个错误和崩溃的应用程序:Android的录音机启动无效状态4

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在textview中。 任何人都可以帮助我?这件事情让我疯狂

这是logcat的:https://dl.dropbox.com/u/16047047/log.txt

,并在手机,它崩溃。

+0

什么是错误(堆栈跟踪)是由start()方法抛出? – Veger

+0

我已经添加了logcat中的主要问题 – Zak

回答

2

看来你错过了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(); 
} 

(你可以read it上grepcode)的例外是,如果双方抛出对象和FileDescriptornull。所以我不认为你可以在不提供文件的情况下使用MediaRecorder。您可以尝试棘手/dev/null,但我不知道它的工作原理,并不能马上测试

+0

,但我并不需要它。 我只需要把getMaxAplitude在TextView的 – Zak

+1

但也许类设计有一个输出文件的工作。你可以尝试使用'/ dev/null' - 对不起,我现在不能测试 – Raffaele

+0

mmm ...不,现在它让我开始失败-2147483648。 等待:在设备上运行!但我必须理解输出值......它似乎不是dB – Zak

1

看起来像你打电话start()两次,一次在活动onCreate(),一次在RecorderTask的构造函数。你应该只需要一个。不知道如何它崩溃 - 像堆栈跟踪 - 很难知道更多。

+0

我把它仅在OnCreate(),另一个是删除 – Zak

+0

加入logcat的 – Zak