You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin开发Android录音应用:MediaRecorder被划横线如何解决?

Android Studio中MediaRecorder被标注横线的问题解决方法

问题描述

使用Kotlin开发Android录音测试应用时,Android Studio里的MediaRecorder类被标注横线,但没有显示任何错误或提示信息,核心代码如下:

package me.soft.myapp

import android.Manifest
import android.content.pm.PackageManager
import android.media.MediaRecorder
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import androidx.core.app.ActivityCompat
import android.util.Log
import java.io.IOException

class MainActivity : AppCompatActivity() {
    private val LOG_TAG = "MainActivity"
    lateinit private var recordBtn:Button
    lateinit private var stopBtn:Button
    lateinit private var playBtn:Button
    private var mediaRecorder: MediaRecorder? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 初始化按钮代码省略......
        recordBtn.setOnClickListener {
            println("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 {
                startRecording()
            }
        }
        // 其他按钮点击事件省略......
    }


    private fun startRecording() {
        // 按钮状态切换代码省略......
        stopBtn.isEnabled = true
        playBtn.isEnabled = false
        recordBtn.isEnabled = false

       mediaRecorder = MediaRecorder().apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            // 输出文件路径、音频编码器等配置省略......

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

            start()
        }
    }
}

原因与解决办法

原因

MediaRecorder被标注横线是因为该类的无参构造方法及部分配置方法在Android API 29(Android 10)及以上版本被标记为废弃(deprecated),Android Studio会用横线标注废弃API,但不会触发编译错误,代码仍可在旧版本系统上运行。

解决办法

有两种可行的处理方式:

1. 继续使用旧API并隐藏废弃提示

如果需要兼容低版本Android系统,且暂时不想迁移新API,可以添加注解隐藏废弃提示:

@Suppress("DEPRECATION")
private fun startRecording() {
    mediaRecorder = MediaRecorder().apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
        // 其他配置代码
    }
}

2. 迁移到官方推荐的新API

Android官方推荐从API 29开始使用MediaRecorder.Builder来构建实例,避免废弃提示,同时获得更好的API兼容性:

import android.os.Build

private fun startRecording() {
    // 按钮状态切换代码......
    stopBtn.isEnabled = true
    playBtn.isEnabled = false
    recordBtn.isEnabled = false

    mediaRecorder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        MediaRecorder.Builder(this)
            .setAudioSource(MediaRecorder.AudioSource.MIC)
            .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            // 添加输出文件路径:.setOutputFile(你的文件路径)
            // 添加音频编码器:.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
            .build()
    } else {
        @Suppress("DEPRECATION")
        MediaRecorder().apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            // 其他配置代码
        }
    }

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

内容的提问来源于stack exchange,提问作者Michel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:39:51