/Cap25/Multimidia/app/src/main/java/dominando/android/multimidia/RecordAudioFragment.kt

https://github.com/nglauber/dominando_android3 · Kotlin · 141 lines · 138 code · 3 blank · 0 comment · 20 complexity · c11a1acd6f784820bd1bd0f955839c10 MD5 · raw file

  1. package dominando.android.multimidia
  2. import android.media.MediaPlayer
  3. import android.media.MediaRecorder
  4. import android.os.Bundle
  5. import android.os.SystemClock
  6. import android.view.LayoutInflater
  7. import android.view.View
  8. import android.view.ViewGroup
  9. import kotlinx.android.synthetic.main.fragment_record_audio.*
  10. import java.io.File
  11. import java.io.IOException
  12. class RecordAudioFragment : MultimediaFragment() {
  13. private var mediaRecorder: MediaRecorder? = null
  14. private var mediaPlayer: MediaPlayer? = null
  15. private var audioFile: File? = null
  16. private var isRecording: Boolean = false
  17. private var isPlaying: Boolean = false
  18. override fun onCreate(savedInstanceState: Bundle?) {
  19. super.onCreate(savedInstanceState)
  20. retainInstance = true
  21. val audioPath = MediaUtils.getLastMediaPath(
  22. requireContext(), MediaUtils.MediaType.MEDIA_AUDIO)
  23. if (audioPath != null) {
  24. audioFile = File(audioPath)
  25. }
  26. }
  27. override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
  28. savedInstanceState: Bundle?): View? {
  29. return inflater.inflate(R.layout.fragment_record_audio, container, false)
  30. }
  31. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  32. super.onViewCreated(view, savedInstanceState)
  33. btnRecord.setOnClickListener {
  34. chronometer.stop()
  35. if (isRecording) {
  36. stopRecording()
  37. } else {
  38. startRecording()
  39. }
  40. updateButtons()
  41. }
  42. btnPlay.setOnClickListener {
  43. chronometer.stop()
  44. if (isPlaying) {
  45. stopPlaying()
  46. } else {
  47. startPlaying()
  48. }
  49. updateButtons()
  50. }
  51. }
  52. override fun onPause() {
  53. super.onPause()
  54. stopRecording()
  55. stopPlaying()
  56. }
  57. private fun startPlaying() {
  58. if (audioFile?.exists() == true) {
  59. if (hasPermission()) {
  60. try {
  61. mediaPlayer = MediaPlayer().apply {
  62. setDataSource(audioFile?.absolutePath)
  63. }
  64. mediaPlayer?.setOnCompletionListener {
  65. isPlaying = false
  66. chronometer.stop()
  67. updateButtons()
  68. }
  69. mediaPlayer?.prepare()
  70. mediaPlayer?.start()
  71. chronometer.base = SystemClock.elapsedRealtime()
  72. chronometer.start()
  73. isPlaying = true
  74. } catch (e: IOException) {
  75. e.printStackTrace()
  76. }
  77. } else {
  78. requestPermissions()
  79. }
  80. }
  81. }
  82. private fun startRecording() {
  83. if (hasPermission()) {
  84. try {
  85. audioFile = MediaUtils.newMedia(MediaUtils.MediaType.MEDIA_AUDIO)
  86. mediaRecorder = MediaRecorder().apply {
  87. setAudioSource(MediaRecorder.AudioSource.MIC)
  88. setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
  89. setOutputFile(audioFile?.absolutePath)
  90. setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
  91. }
  92. mediaRecorder?.prepare()
  93. mediaRecorder?.start()
  94. chronometer.base = SystemClock.elapsedRealtime()
  95. chronometer.start()
  96. isRecording = true
  97. } catch (e: Exception) {
  98. e.printStackTrace()
  99. }
  100. } else {
  101. requestPermissions()
  102. }
  103. }
  104. private fun updateButtons() {
  105. btnRecord.setImageResource(
  106. if (isRecording)
  107. android.R.drawable.ic_media_pause
  108. else
  109. android.R.drawable.ic_btn_speak_now)
  110. btnRecord.isEnabled = !isPlaying
  111. btnPlay.setImageResource(
  112. if (isPlaying)
  113. android.R.drawable.ic_media_pause
  114. else
  115. android.R.drawable.ic_media_play)
  116. btnPlay.isEnabled = !isRecording
  117. }
  118. private fun stopPlaying() {
  119. if (mediaPlayer != null && isPlaying) {
  120. mediaPlayer?.stop()
  121. mediaPlayer?.release()
  122. mediaPlayer = null
  123. isPlaying = false
  124. }
  125. }
  126. private fun stopRecording() {
  127. if (mediaRecorder != null && isRecording) {
  128. mediaRecorder?.stop()
  129. mediaRecorder?.release()
  130. mediaRecorder = null
  131. isRecording = false
  132. audioFile?.let {
  133. MediaUtils.saveLastMediaPath(requireContext(),
  134. MediaUtils.MediaType.MEDIA_AUDIO, it.absolutePath)
  135. }
  136. }
  137. }
  138. }