在Android上录制和保存audio

我正在开发一个android(2.2)应用程序来录制audio。 代码似乎运行良好,甚至保存在SD卡上的文件,但是当我尝试播放我的Mac上的audio文件没有任何反应。 几乎像文件是空的。 我试过将它们保存为.mp3和.wav,但没有运气。 我的代码如下:

import java.io.File; import java.io.IOException; import android.media.MediaRecorder; import android.os.Environment; public class AudioRecorder { private MediaRecorder recorder = new MediaRecorder(); private File outfile = null; public AudioRecorder(){} public void startRecording(String audioFile) throws IOException { String state = android.os.Environment.getExternalStorageState(); if(!state.equals(android.os.Environment.MEDIA_MOUNTED)) { throw new IOException("SD Card is not mounted. It is " + state + "."); } // make sure the directory we plan to store the recording in exists File directory = new File(path).getParentFile(); if (!directory.exists() && !directory.mkdirs()) { throw new IOException("Path to file could not be created."); } try{ File storageDir = new File(Environment .getExternalStorageDirectory(), "/audio/"); storageDir.mkdir(); outfile=File.createTempFile(audioFile, ".wav",storageDir); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(outfile.getAbsolutePath()); }catch(IOException e){ e.printStackTrace(); } try{ recorder.prepare(); }catch(IllegalStateException e){ e.printStackTrace(); } recorder.start(); } public void stop() throws IOException { recorder.stop(); recorder.release(); } } 

我的活动:

 /** * Recording Activity */ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import com.seekika.android.app.helpers.AudioRecorder; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Chronometer; public class Record extends Activity { private static final String TAG="RecordActivity"; private int SETTINGS=Menu.FIRST; private int LOGOUT=Menu.FIRST + 1; private int EXIT=Menu.FIRST + 2; //components private Button mBtnStartRecording; private Button mBtnStopRecording; private Chronometer mChronometer; private String audioFileName=""; final AudioRecorder recorder = new AudioRecorder(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recordstory); initComponents(); } public void initComponents(){ mChronometer=(Chronometer)findViewById(R.id.chrono); mBtnStopRecording=(Button)findViewById(R.id.btn_stop_recording); mBtnStopRecording.setEnabled(false); mBtnStopRecording.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //stop timer stopRecording(); //stop recording and save audio file to SD card } }); mBtnStartRecording=(Button)findViewById(R.id.btn_start_recording); mBtnStartRecording.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startRecording(); mBtnStartRecording.setEnabled(false); mBtnStopRecording.setEnabled(true); //start recording audio //start timer } }); } private void startRecording(){ mChronometer.setBase(SystemClock.elapsedRealtime()); mChronometer.start(); try{ String myRecording="Seekika-" + System.currentTimeMillis(); Log.i(TAG, "Start Recording"); recorder.startRecording(myRecording); }catch(IOException e){ Log.e(TAG,"IOException error"); e.printStackTrace(); } } private void stopRecording(){ mChronometer.stop(); try{ recorder.stop(); }catch(IOException e){ e.printStackTrace(); } } } 

Solutions Collecting From Web of "在Android上录制和保存audio"

不知道你是否可以使用这个,但这对我有用:

 public void recordAudio(String fileName) { final MediaRecorder recorder = new MediaRecorder(); ContentValues values = new ContentValues(3); values.put(MediaStore.MediaColumns.TITLE, fileName); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); recorder.setOutputFile("/sdcard/sound/" + fileName); try { recorder.prepare(); } catch (Exception e){ e.printStackTrace(); } final ProgressDialog mProgressDialog = new ProgressDialog(MyActivity.this); mProgressDialog.setTitle(R.string.lbl_recording); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mProgressDialog.setButton("Stop recording", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mProgressDialog.dismiss(); recorder.stop(); recorder.release(); } }); mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ public void onCancel(DialogInterface p1) { recorder.stop(); recorder.release(); } }); recorder.start(); mProgressDialog.show(); } 
  recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

这意味着你想用OUTPUTFORMAT创build(logging)一个文件为RAW_AMR

但只是提供一个文件名为.mp3的文件path,我猜不会。 这可能是问题所在。

查看创build项目的详细信息(长按文件并单击详细信息),它会提供有关文件的一些信息,如窗口右键单击属性。