2012-11-29 43 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