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
相关产品推荐
相关产品推荐

