2

我正在制作一个 android 应用程序来录制声音。为此,我一直在使用 MediaRecorder 类。

在任何设备上首次录制时,录制成功。但是下次就不行了。

如果我在另一台机器上尝试该代码,则录制成功。是不是因为 MediaRecorder 实例没有被应用程序释放,即使我正在调用方法release()

这是我的代码-

 public class NewClass extends Activity {
private static String sFileName = null;
private static String sFileNameMSD = null;
private static String sPlayFile = null;
public MediaRecorder mRecorder = null;
private String mPn_id;
private String mDescription;
private String mTask_flag;
private String mPatient_name;
private String mPatient_id;
private String mIs_upload = "N";
private Context mContext;
Button btnStart;
Button btnStop;
private int mReuqestcode;
NewClass myActivity;
SeekBar seekBar;
int totalTime;
private final Handler handler = new Handler();
private final String FILE_EXTENTION_AMR = ".amr";
private final String FILE_EXTENTION_MSD = ".msd";
protected boolean recodeFlag = false;;
private static final String TAG = GridAllActivity.class.getName();

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.transcriptionrecord_activity);
    mContext = this;
    myActivity = this;
    Main.setTitle(myActivity, mContext);

    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            mContext));
    TextView txtTitle = (TextView) findViewById(R.id.txt_Title1);
    txtTitle.setText("Transcription");
    TextView txtOption = (TextView) findViewById(R.id.txtOptionName);
    TextView txtPatientName = (TextView) findViewById(R.id.txtPatientName);
    setProperty();
    txtOption.setText("" + mDescription);
    txtPatientName.setText("" + mPatient_name);
}
private void onRecord(boolean start) throws SettingNotFoundException {
    if (start) {
        startRecording();
    } else {
        stopRecording();
        }
}

private void startRecording() throws SettingNotFoundException {
    mRecorder = new MediaRecorder();

    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
    mRecorder.setOutputFile(sFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    try {

        mRecorder.prepare();

        mRecorder.start();
    } catch (IOException e) {

        recodeFlag=true;
        Log.e("1", "prepare() failed");
        e.printStackTrace();
    }

}

private void stopRecording() throws SettingNotFoundException {

    mRecorder.stop();
    mRecorder.release();
    Log.d("1", "mRecorder released");
    mRecorder = null;
    System.gc();
}

public void setRecordPath() throws IOException {

    sFileName = Environment.getExternalStorageDirectory().getAbsolutePath();

    sFileName += Global.creteFolderPath("IMSEMR" + mTask_flag + "_"
            + mPn_id + FILE_EXTENTION_AMR);
    sFileNameMSD = "IMSEMR" + mTask_flag + "_" + mPn_id
            + FILE_EXTENTION_MSD;
    String state = android.os.Environment.getExternalStorageState();
    if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
        Global.alertbox("", "SD Card is not mounted.", mContext);
        throw new IOException("SD Card is not mounted.  It is " + state
                + ".");
    }

    File directory = new File(sFileName).getParentFile();
    if (!directory.exists() && !directory.mkdirs()) {
        directory.mkdirs();
        throw new IOException("Path to file could not be created.");
    }

}

public void setRecodingLayout() {

    btnStop.setEnabled(false);
    try {
        btnStart.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                boolean mStartRecording = true;
                try {
                    btnStop.setEnabled(true);
                    btnStart.setEnabled(false);
                    onRecord(mStartRecording);

                } catch (SettingNotFoundException e) {
                    e.printStackTrace();
                }

            }
        });         
                    btnStop.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                try {
                boolean mStartRecording = false;
                try {
                    onRecord(mStartRecording);
                } catch (SettingNotFoundException e) {
                    e.printStackTrace();
                }

            } catch (SQLiteException e) {
                // TODO: handle exception
            } catch (Exception e) {
                // TODO: handle exception
            }
                        }
        });

    } catch (NullPointerException e) {

    }
}

public void setProperty() {
    Bundle bundel = getIntent().getExtras();
    mReuqestcode = (Integer) bundel.get("REQUEST_CODE");
    // property for Record
    if (mReuqestcode == 1) {
        mPn_id = (String) bundel.get("PN_ID");
        mDescription = (String) bundel.get("DESCRIPTION");
        mTask_flag = (String) bundel.get("TASK_FLAG");
        mPatient_id = (String) bundel.get("PATIENT_ID");
        mPatient_name = (String) bundel.get("PATIENT_NAME");
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);
        btnStop.setEnabled(false);
        setRecodingLayout();
        try {
            setRecordPath();
        } catch (IOException e) {
            e.printStackTrace();
        }
     }
    }
   }
4

1 回答 1

0

每次要录制时,您都需要创建一个新的媒体记录器实例(确保释放前一个)。

更新——对不起,如果你在对象上调用释放,你只需要创建一个新实例。否则你可以调用reset,阅读这个:http: //developer.android.com/reference/android/media/MediaRecorder.html

示例:假设您有一个带有 2 个按钮、一个录制按钮和一个播放按钮的活动

public class MyRecordDemo extends Activity {
   private static final String PATH_NAME = "/sdcard/myfile.3gp"; //probably shouldn't hardcode this
   private Button mRecordButton, mStopButton;
   private MediaRecorder mRecorder = null;
   private boolean mIsRecording = false;
   public void onCreate(Bundle state) {
      super.onCreate(state);
      setContentView(R.layout.recorder_demo);
      mRecordButton = (Button) findViewById(R.id.record_btn);
      mStopButton = (Button) findViewById(R.id.stop_btn);
      mStopButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
             if (mIsRecording && mRecorder != null) {
               mRecorder.stop(); 
               mRecorder.release();
             }
          }
      });
      mRecordButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
          if (mIsRecording && mRecorder != null) {
              mRecorder.stop(); 
              mRecorder.release();
           }
           mRecorder = new MediaRecorder();
           mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
           mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
           mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
           mRecorder.setOutputFile(PATH_NAME);
           mRecorder.prepare();
           mRecorder.start()
        }

      });
   }

}
于 2012-09-13T05:16:31.763 回答