mercredi 25 août 2021

This if statement that make this "state= true" and make app error out Kotlin

I am using the Kotlin in this timer app trying to pause the timer I get this error. It's not running the first if statement that is true.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.proITAssets.myapplication, PID: 12792
    java.lang.IllegalStateException
        at android.media.MediaRecorder.pause(Native Method)
        at com.proITAssets.myapplication.MainActivity.pauseRecording(MainActivity.kt:143)
        at com.proITAssets.myapplication.MainActivity.access$pauseRecording(MainActivity.kt:23)
        at com.proITAssets.myapplication.MainActivity$onCreate$3.onClick(MainActivity.kt:87)
        at android.view.View.performClick(View.java:7125)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

This is a code snippet for the pause function.

@SuppressLint("RestrictedApi", "SetTextI18n")
    @TargetApi(Build.VERSION_CODES.N)
    private fun pauseRecording() {
       
        if(state) {
            pauseTimer()
            Toast.makeText(this,"This is working", Toast.LENGTH_SHORT).show()
            if(!recordingStopped){
                Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
                mediaRecorder?.pause()
                recordingStopped == true
                button_pause_recording.text = "Resume"
            }else{
                resumeRecording()
                resumeTimer()
            }
        }else{
            Toast.makeText(this,"this is not working", Toast.LENGTH_SHORT).show()
        }
  

}

This is all the code that the program used to run please let me know where the problem may be.

class MainActivity : AppCompatActivity() {

    private var output: String? = null
    private var mediaRecorder: MediaRecorder? = null
    private var state: Boolean = false
    private var recordingStopped: Boolean = false
    private var mp= MediaPlayer()
    private var recordingfile = ""
    private var chronometerPausedTime: Long = 0

    private val thename by lazy {findViewById<TextView>(R.id.ed_name)}

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

         val name = "$thename".trim()

        mediaRecorder = MediaRecorder()
        output = Environment.getExternalStorageDirectory().toString() + name

        button_stop_recording.isEnabled = false
        button_pause_recording.isEnabled = false

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            val permissions = arrayOf(
                android.Manifest.permission.RECORD_AUDIO,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
            )
            ActivityCompat.requestPermissions(this, permissions, 0)
        }
        button_start_recording.setOnClickListener {
            if (!thename.text.toString().isNotEmpty()){
                Toast.makeText(this, "User need to enter the file name", Toast.LENGTH_SHORT).show()
            }else{
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
                    ActivityCompat.requestPermissions(this, permissions,0)
                } else {
                    savefilename()
                    startRecording()
                    button_stop_recording.isEnabled = true
                    button_start_recording.isEnabled = false
                    button_pause_recording.isEnabled = true
                }
                savefilename()
            }
        }
        mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
        mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
        mediaRecorder?.setOutputFile(output)

        button_stop_recording.setOnClickListener{
            stopRecording()
            button_start_recording.isEnabled = true
            button_stop_recording.isEnabled = false
        }

        button_pause_recording.setOnClickListener {
            pauseRecording()
            button_start_recording.isEnabled = true
        }

        btn_play.setOnClickListener {
            playRecording()
        }
    }

    private fun startRecording() {
        startFromZero()
        state = true
        if (!state){
            Toast.makeText(this, "This is false", Toast.LENGTH_SHORT).show()
        }else{
            Toast.makeText(this, "this is true", Toast.LENGTH_SHORT).show()
        }

        var name = File(getExternalFilesDir("/"),recordingfile)
        //val name = Activity()?.getExternalFilesDir("/")?.absolutePath
        val timestamp = SimpleDateFormat(
            "MM/dd/yyyy_HH:mm:ss:a",
            Locale.US,
        ).format(System.currentTimeMillis())
        val date = Date()
        recordingfile = "${ed_name.text}" + timestamp.format(date) + ".mp3"

        try {
            if (name != null) {
                    Toast.makeText(this, "This is your file name $recordingfile", Toast.LENGTH_SHORT).show()
                }
            mediaRecorder?.setOutputFile("/" + name + recordingfile)
            mediaRecorder?.prepare()
            mediaRecorder?.start()

            Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show()
        } catch (e: IllegalStateException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    @SuppressLint("RestrictedApi", "SetTextI18n")
    @TargetApi(Build.VERSION_CODES.N)
    private fun pauseRecording() {

        if(state) {
            pauseTimer()
            Toast.makeText(this,"This is working", Toast.LENGTH_SHORT).show()
            if(!recordingStopped){
                Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
                mediaRecorder?.pause()
                recordingStopped == true
                button_pause_recording.text = "Resume"
            }else{
                resumeRecording()
                resumeTimer()
            }
        }else{
            Toast.makeText(this,"this is not working", Toast.LENGTH_SHORT).show()
        }
    }

    @SuppressLint("RestrictedApi", "SetTextI18n")
    @TargetApi(Build.VERSION_CODES.N)
    private fun resumeRecording() {
        Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show()
        mediaRecorder?.resume()
        button_pause_recording.text = "Pause"
        recordingStopped == false


    }

    private fun stopRecording(){

        stopTimer()
        if(state){
            mediaRecorder?.stop()
            mediaRecorder?.release()
            state = false
            simpleChronometer.stop()
        }else{
            Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show()
        }
    }
    private fun playRecording(){

        mp.setDataSource(output)
        mp.prepare()
        mp.start()
    }

    private fun savefilename(){

        val name = "rec_$thename.mp3"
        val timestamp = SimpleDateFormat("MMddyyyy_HHmmss",
            Locale.getDefault()).format(System.currentTimeMillis())

        try {
            val rec = File("$output/Recording/")
            mediaRecorder = MediaRecorder()
            output = Environment.getExternalStorageDirectory().toString() + "/$thename.mp3"

            val file = File(name)
            val fw = FileWriter(file.absoluteFile)
            val bw = BufferedWriter(fw)
            bw.write(name)
            bw.close()

            Toast.makeText(this, name +"is name of the file \n" + rec, Toast.LENGTH_LONG).show()

        }catch (e: Exception){
             Toast.makeText(this, e.message, Toast.LENGTH_SHORT )
        }
    }

    private fun startFromZero() {
        simpleChronometer.base = SystemClock.elapsedRealtime()
        simpleChronometer.start()
    }

    private fun pauseTimer() {
        chronometerPausedTime = SystemClock.elapsedRealtime() - this.simpleChronometer.base
        simpleChronometer.stop()
    }

    private fun resumeTimer() {
        simpleChronometer.base = SystemClock.elapsedRealtime() - chronometerPausedTime
        chronometerPausedTime = 0
        simpleChronometer.start()
    }
    private fun stopTimer(){
        simpleChronometer.base = SystemClock.elapsedRealtime()
        simpleChronometer.stop()
    }
}

Thank you for the help.

Aucun commentaire:

Enregistrer un commentaire