【问题标题】:How do I stop recording AudioRecord when button press out on Kotlin在 Kotlin 上按下按钮时如何停止录制 AudioRecord
【发布时间】:2021-08-13 14:01:52
【问题描述】:

我有三个问题。 首先:我必须停止向服务器录制音频和流数据。 第二:我想保存文件并将整个文件发送到服务器。 第三:我必须在接收器中播放这些块。

向服务器发送音频:

btn_send.setOnTouchListener(object : View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent?): Boolean {
            when (event?.action) {
                MotionEvent.ACTION_DOWN -> {
                    Log.i("tou7ch", "apertou")
                    val buffer = ByteArray(minBufSize)
                    val chunks = buffer.toByteString()
                    audiorecord!!.startRecording()

                    val number = audiorecord!!.read(buffer, 0, minBufSize)
                    for (i in 0 until number) {
                        webSocket.send(chunks)
                    }
                }
                MotionEvent.ACTION_UP -> {
                    Log.i("tou7ch", "soltou")
                    audiorecord?.stop();
                }
            }

            return v?.onTouchEvent(event) ?: true
        }
    })

发送时效果很好,但我不知道如何停止发送。当从按钮上移开手指时,我有一个Log.i("tou7ch", "soltou"),它被完美地调用了。 如果我这样放一段时间:

                    while (true) {
                        val number = audiorecord!!.read(buffer, 0, minBufSize)
                        for (i in 0 until number) {
                            webSocket.send(chunks)
                        }
                    }

或任何其他要验证的变量,应用程序会永久停止运行。如何停止将其发送到服务器?如何停止录制?如何在接收器中播放这些块?如何将整个文件保存在 .wav 中?

感谢开发者!

【问题讨论】:

  • 你应该为此实现协程!
  • 谢谢!我去看看!我真的很高兴你的生活。祝福!

标签: android android-studio kotlin websocket


【解决方案1】:

如果您使用 kotlin,最佳方式是使用协程,但如果您不希望这是使用线程执行此操作的经典方式:

btn_send.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
var thread?=null
                  when (event?.action) {
                   MotionEvent.ACTION_DOWN -> {
                   Log.i("tou7ch", "apertou")   
                    thread = Thread(){
                    override fun run(){
                   val buffer = ByteArray(minBufSize)
                        val chunks = buffer.toByteString()
                        audiorecord!!.startRecording()
    
                        val number = audiorecord!!.read(buffer, 0, minBufSize)
                        for (i in 0 until number) {
                            webSocket.send(chunks)
                        }
                    }
                    MotionEvent.ACTION_UP -> {
                        Log.i("tou7ch", "soltou")
                        audiorecord?.stop();
                        thread.interrupt();
                    }
                }
                  }
               }

  

            return v?.onTouchEvent(event) ?: true
        }
    })

【讨论】:

  • 谢谢!我会尝试协程。
  • 高级Patel,使用协程,应用程序停止中断,但我在 while(isActive) 时仍然遇到问题。这使应用程序崩溃。如何停止发送块?
  • 请将您的日志发布在应用程序崩溃的地方,有时当您安装错误版本的协程时会导致应用程序崩溃
  • 在你的情况下,因为你没有经验,你可以使用经典线程方法
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 2021-10-05
相关资源
最近更新 更多