@@ -79,6 +79,50 @@ private void startRecord(Context context, String seed, String phoneNumber) {
7979 return ;
8080 }
8181
82+ if (isRecordStarted ) {
83+ try {
84+ recorder .stop (); // stop the recording
85+ } catch (RuntimeException e ) {
86+ // RuntimeException is thrown when stop() is called immediately after start().
87+ // In this case the output file is not properly constructed ans should be deleted.
88+ Log .d (TAG , "RuntimeException: stop() is called immediately after start()" );
89+ //noinspection ResultOfMethodCallIgnored
90+ audiofile .delete ();
91+ }
92+ releaseMediaRecorder ();
93+ isRecordStarted = false ;
94+ } else {
95+ if (prepareAudioRecorder (context , seed , phoneNumber )) {
96+ recorder .start ();
97+ isRecordStarted = true ;
98+ onRecordingStarted (context , callRecord , audiofile );
99+ Log .i (TAG , "record start" );
100+ } else {
101+ releaseMediaRecorder ();
102+ }
103+ //new MediaPrepareTask().execute(null, null, null);
104+ }
105+ } catch (IllegalStateException e ) {
106+ e .printStackTrace ();
107+ }
108+ }
109+
110+ private void stopRecord (Context context ) {
111+ try {
112+ if (recorder != null && isRecordStarted ) {
113+ releaseMediaRecorder ();
114+ isRecordStarted = false ;
115+ onRecordingFinished (context , callRecord , audiofile );
116+ Log .i (TAG , "record stop" );
117+ }
118+ } catch (Exception e ) {
119+ releaseMediaRecorder ();
120+ e .printStackTrace ();
121+ }
122+ }
123+
124+ private boolean prepareAudioRecorder (Context context , String seed , String phoneNumber ) {
125+ try {
82126 String file_name = PrefsHelper .readPrefString (context , CallRecord .PREF_FILE_NAME );
83127 String dir_path = PrefsHelper .readPrefString (context , CallRecord .PREF_DIR_PATH );
84128 String dir_name = PrefsHelper .readPrefString (context , CallRecord .PREF_DIR_NAME );
@@ -94,7 +138,6 @@ private void startRecord(Context context, String seed, String phoneNumber) {
94138 sampleDir .mkdirs ();
95139 }
96140
97-
98141 StringBuilder fileNameBuilder = new StringBuilder ();
99142 fileNameBuilder .append (file_name );
100143 fileNameBuilder .append ("_" );
@@ -138,18 +181,11 @@ private void startRecord(Context context, String seed, String phoneNumber) {
138181
139182 audiofile = File .createTempFile (file_name , suffix , sampleDir );
140183
141- if (recorder != null ) {
142- recorder .stop ();
143- recorder .release ();
144- recorder = null ;
145- }
146-
147184 recorder = new MediaRecorder ();
148185 recorder .setAudioSource (audio_source );
149186 recorder .setOutputFormat (output_format );
150187 recorder .setAudioEncoder (audio_encoder );
151188 recorder .setOutputFile (audiofile .getAbsolutePath ());
152-
153189 recorder .setOnErrorListener (new MediaRecorder .OnErrorListener () {
154190 @ Override
155191 public void onError (MediaRecorder mediaRecorder , int i , int i1 ) {
@@ -158,34 +194,55 @@ public void onError(MediaRecorder mediaRecorder, int i, int i1) {
158194 }
159195 });
160196
161- recorder .prepare ();
162- recorder .start ();
163-
164- isRecordStarted = true ;
165- onRecordingStarted (context , callRecord , audiofile );
166-
167- Log .i (TAG , "record start" );
168- } catch (IllegalStateException | IOException e ) {
197+ try {
198+ recorder .prepare ();
199+ } catch (IllegalStateException e ) {
200+ Log .d (TAG , "IllegalStateException preparing MediaRecorder: " + e .getMessage ());
201+ releaseMediaRecorder ();
202+ return false ;
203+ } catch (IOException e ) {
204+ Log .d (TAG , "IOException preparing MediaRecorder: " + e .getMessage ());
205+ releaseMediaRecorder ();
206+ return false ;
207+ }
208+ return true ;
209+ } catch (Exception e ) {
169210 e .printStackTrace ();
211+ return false ;
170212 }
171213 }
172214
173- private void stopRecord (Context context ) {
174- try {
175- if (recorder != null && isRecordStarted ) {
176- recorder .stop ();
177- recorder .reset ();
178- recorder .release ();
179- recorder = null ;
180-
181- isRecordStarted = false ;
182- onRecordingFinished (context , callRecord , audiofile );
215+ private void releaseMediaRecorder () {
216+ if (recorder != null ) {
217+ recorder .reset ();
218+ recorder .release ();
219+ recorder = null ;
220+ }
221+ }
183222
184- Log .i (TAG , "record stop" );
223+ /*
224+ class MediaPrepareTask extends AsyncTask<Void, Void, Boolean> {
225+ @Override
226+ protected Boolean doInBackground(Void... voids) {
227+ if (prepareAudioRecorder(, "", "")) {
228+ // Camera is available and unlocked, MediaRecorder is prepared,
229+ // now you can start recording
230+ recorder.start();
231+ Log.i(TAG, "record start");
232+ } else {
233+ // prepare didn't work, release the camera
234+ releaseMediaRecorder();
235+ return false;
185236 }
186- } catch (Exception e ) {
187- e .printStackTrace ();
237+ return true;
238+ }
239+
240+ @Override
241+ protected void onPostExecute(Boolean result) {
242+ isRecordStarted = true;
243+ onRecordingStarted(, callRecord, audiofile);
188244 }
189245 }
246+ */
190247
191248}
0 commit comments