diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java index 4447f32707094d8c671865f06ef3814a87e7bdff..81f271dd7421c916479e1d42c77ac87b95c50106 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java +++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java @@ -462,6 +462,12 @@ public class TvConversationFragment extends BaseSupportFragment<TvConversationPr requireActivity().invalidateOptionsMenu(); } + @Override + public void onStop() { + releaseRecorder(); + super.onStop(); + } + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -507,30 +513,33 @@ public class TvConversationFragment extends BaseSupportFragment<TvConversationPr } private void startRecording() { - try { - fileName = AndroidFileUtils.createAudioFile(getContext()); - } catch (IOException e) { + if (recorder != null) { return; } - recorder = new MediaRecorder(); - recorder.setAudioSource(MediaRecorder.AudioSource.MIC); - recorder.setOutputFile(fileName.getAbsolutePath()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - recorder.setOutputFormat(MediaRecorder.OutputFormat.OGG); - recorder.setAudioEncoder(MediaRecorder.AudioEncoder.OPUS); - } else { - recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); - recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); - } - try { + fileName = AndroidFileUtils.createAudioFile(requireContext()); + recorder = new MediaRecorder(); + recorder.setAudioSource(MediaRecorder.AudioSource.MIC); + recorder.setOutputFile(fileName.getAbsolutePath()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + recorder.setOutputFormat(MediaRecorder.OutputFormat.OGG); + recorder.setAudioEncoder(MediaRecorder.AudioEncoder.OPUS); + } else { + recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); + recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); + } + recorder.prepare(); - } catch (IOException e) { - Log.e(LOG_TAG, "prepare() failed"); + recorder.start(); + } catch (Exception e) { + Toast.makeText(requireContext(), "Error starting recording: " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); + if (recorder != null) { + recorder.release(); + recorder = null; + } + return; } - recorder.start(); - mAudioButton.setImageResource(R.drawable.lb_ic_stop); mTextAudio.setText(R.string.tv_audio_recording); Animation anim = new AlphaAnimation(0.0f, 1.0f); @@ -541,18 +550,23 @@ public class TvConversationFragment extends BaseSupportFragment<TvConversationPr mTextAudio.startAnimation(anim); } - private void stopRecording() { - if (recorder == null) { - return; + private void releaseRecorder() { + if (recorder != null) { + try { + recorder.stop(); + } catch (Exception e) { + Log.w(TAG, "Exception stopping recorder"); + } + recorder.release(); + recorder = null; } - recorder.stop(); - recorder.release(); - recorder = null; + } + private void stopRecording() { + releaseRecorder(); mAudioButton.setImageResource(R.drawable.baseline_mic_24); mTextAudio.setText(R.string.tv_send_audio); mTextAudio.clearAnimation(); - createAudioDialog(); }