2012-02-21 22 views
0

編輯:當我點擊錄製按鈕第二次(停止錄音)它強制關閉應用程序。該事件的具體代碼:Android - 如何錄製簡單的soundbite?

else if(isrec) { 
       recorder.stop(); 
       recorder.reset(); 
       recorder.release(); 
       recorder = null; 
       isrec = false; 
       Toast.makeText(getApplicationContext(),"No longer recording!",Toast.LENGTH_SHORT).show(); 
      } 

(原題): 我有麻煩試圖讓一個應用程序來記錄聲音上的按鈕點擊。我已經包含的代碼...這就是我的祝酒詞告訴我:

  • 後setAudioSource
  • setOutputFile後
  • ISREC是不正確的
  • 嘗試...
  • 抓IO異常...

任何幫助是極大的讚賞。

private OnClickListener micListener = new OnClickListener() { 
    boolean isrec = false; 
    public void onClick(View v) { 
     MediaRecorder recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     Toast.makeText(getApplicationContext(),"after setAudioSource",Toast.LENGTH_SHORT).show(); 
     recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
     File outputFile = null; 
     outputFile = getFileStreamPath("output.amr"); 
     recorder.setOutputFile(outputFile.getAbsolutePath()); 

     Toast.makeText(getApplicationContext(),"after setOutputFile",Toast.LENGTH_SHORT).show(); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     if(!isrec) { 
      Toast.makeText(getApplicationContext(),"isrec is not true",Toast.LENGTH_SHORT).show(); 
      try { 
       Toast.makeText(getApplicationContext(),"trying...",Toast.LENGTH_SHORT).show(); 
       recorder.prepare(); 
       recorder.start(); 
       isrec = true; 
       Toast.makeText(getApplicationContext(),"Recording!",Toast.LENGTH_SHORT).show(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(),"caught IllegalState Exception...",Toast.LENGTH_SHORT).show(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(),"caught IO Exception...",Toast.LENGTH_SHORT).show(); 
      } 
     } else if(isrec) { 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 
      recorder = null; 
      isrec = false; 
      Toast.makeText(getApplicationContext(),"No longer recording!",Toast.LENGTH_SHORT).show(); 
     } 
    } 
}; 

回答

0

首先,你應該使用布爾isrec而不是字符串

即:

FileDescriptor fileName = null; 
    recorder.setOutputFile(fileName); 

這意味着你要在一個文件,該文件是空記錄

如果創建一個文件,並且把它作爲您的刻錄機的參數,它應該工作。

編輯:有時當您想要停止錄音機時,發佈不起作用。 所以,只要保持stop()reset()

+0

謝謝!我創建了一個文件,它不再給IO異常,所以這是很好的,但現在當我按一下按鈕第二次,我得到一個強制關閉。我更新了原始帖子中的代碼。 – user1212011 2012-02-21 23:02:35

+0

不要做釋放。我有同樣的問題。嘗試刪除釋放,並保持停止和重置 – 2012-02-21 23:49:37

0

也許this會有幫助嗎?本文將向您展示如何解決兩個問題:

  1. 顯示記錄WAV文件的方式。以最好的質量越好
  2. 錄製音頻。
0

嘗試爲主要活動如下代碼:

public class AudioRecordTestActivity extends Activity 
{ 
private static final String LOG_TAG = "AudioRecordTest"; 
private static String mFileName = null; 

private RecordButton mRecordButton = null; 
private MediaRecorder mRecorder = null; 

private PlayButton mPlayButton = null; 
private MediaPlayer mPlayer = null; 

private void onRecord(boolean start) { 
    if (start) { 
     startRecording(); 
    } else { 
     stopRecording(); 
    } 
} 

private void onPlay(boolean start) { 
    if (start) { 
     startPlaying(); 
    } else { 
     stopPlaying(); 
    } 
} 

private void startPlaying() { 
    mPlayer = new MediaPlayer(); 
    try { 
     mPlayer.setDataSource(mFileName); 
     mPlayer.prepare(); 
     mPlayer.start(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "prepare() failed"); 
    } 
} 

private void stopPlaying() { 
    mPlayer.release(); 
    mPlayer = null; 
} 

private void startRecording() { 
    mRecorder = new MediaRecorder(); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mRecorder.setOutputFile(mFileName); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

    try { 
     mRecorder.prepare(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "prepare() failed"); 
    } 

    mRecorder.start(); 
} 

private void stopRecording() { 
    mRecorder.stop(); 
    mRecorder.release(); 
    mRecorder = null; 
} 

class RecordButton extends Button { 
    boolean mStartRecording = true; 

    OnClickListener clicker = new OnClickListener() { 
     public void onClick(View v) { 
      onRecord(mStartRecording); 
      if (mStartRecording) { 
       setText("Stop recording"); 
      } else { 
       setText("Start recording"); 
      } 
      mStartRecording = !mStartRecording; 
     } 
    }; 

    public RecordButton(Context ctx) { 
     super(ctx); 
     setText("Start recording"); 
     setOnClickListener(clicker); 
    } 
} 

class PlayButton extends Button { 
    boolean mStartPlaying = true; 

    OnClickListener clicker = new OnClickListener() { 
     public void onClick(View v) { 
      onPlay(mStartPlaying); 
      if (mStartPlaying) { 
       setText("Stop playing"); 
      } else { 
       setText("Start playing"); 
      } 
      mStartPlaying = !mStartPlaying; 
     } 
    }; 

    public PlayButton(Context ctx) { 
     super(ctx); 
     setText("Start playing"); 
     setOnClickListener(clicker); 
    } 
} 

public AudioRecordTestActivity() { 
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    mFileName += "/audiorecordtest.3gp"; 
} 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    LinearLayout ll = new LinearLayout(this); 
    mRecordButton = new RecordButton(this); 
    ll.addView(mRecordButton, 
     new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      0)); 
    mPlayButton = new PlayButton(this); 
    ll.addView(mPlayButton, 
     new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      0)); 
    setContentView(ll); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    if (mRecorder != null) { 
     mRecorder.release(); 
     mRecorder = null; 
    } 

    if (mPlayer != null) { 
     mPlayer.release(); 
     mPlayer = null; 
    } 
} 

,並在清單文件中指定以下權限

<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />