音声を録音する Android アプリケーションを作成しています。そのためにクラス MediaRecorder を使用しています。
任意のデバイスで初めて録音が行われると、録音は正常に完了します。でも次はうまくいきません。
別のマシンでコードを試すと、記録は正常に行われます。method を呼び出しても 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();
}
}
}
}