簡體   English   中英

Android 中的錄音(使用 kotlin)

[英]Audio recording in Android (with kotlin)

我正在開發一個試用應用程序來在 Android(使用 kotlin)中進行錄音。

這是我目前遇到的問題。

在以下代碼中:

recordBtn.setOnClickListener {
    if (applicationContext.checkSelfPermission(
            Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO)
        ActivityCompat.requestPermissions(this, permissions,0)
    } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            startRecording()
        }
    }
}

startRecording() function 沒有被執行,因為: Build.VERSION.SDK_INT = 28Build.VERSION_CODES.S = 31如果我刪除測試以強制執行startRecording() ,那么正如人們所料,應用程序崩潰.

我的問題是:我該怎么做才能至少在我自己的設備上擁有更高的 Build.VERSION.SDK_INT?

我為在網上找到答案所做的研究並沒有讓我得到明確的答案。

此處允許進一步評論是包含 startRecording() function 的代碼:

@SuppressLint("RestrictedApi")
@RequiresApi(Build.VERSION_CODES.S)
private fun startRecording() {
    //isRecording = true
    stopBtn.isEnabled = true
    playBtn.isEnabled = false
    recordBtn.isEnabled = false

    val theAudioFile = File(getFilesDir(), "Audio_Record_File")

    mediaRecorder = MediaRecorder(applicationContext).apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
        setOutputFile(theAudioFile)
        setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)

        try {
            prepare()
        } catch (e: IOException) {
            Log.e(LOG_TAG, "prepare() failed")
        }

        start()
    }
}

首先你應該看看這里: https://developer.android.com/reference/android/media/MediaRecorder

如您所見,僅在 API 31 中添加了構造函數public MediaRecorder (Context context)

您可以嘗試對低於 31 的 API 使用已棄用的構造函數,如下所示:

val mediaRecorder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        MediaRecorder(applicationContext)
    } else {
        MediaRecorder()
    }.apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
        setOutputFile(theAudioFile.path)
        setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)

        try {
            prepare()
        } catch (e: IOException) {

        }

        start()
    }

並在調用 startRecording 之前刪除您的@RequiresApi(Build.VERSION_CODES.S)注釋和if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM