Android(Kotlin)录音开发:如何提升设备Build.VERSION.SDK_INT
解决方案
首先明确:设备的Build.VERSION.SDK_INT由Android系统版本决定,无法通过应用代码提升——除非给设备刷机升级系统,但这完全没必要,修改代码适配低版本系统才是最优解。
你的核心问题是startRecording()函数被标记了@RequiresApi(Build.VERSION_CODES.S)(对应API31),且内部使用了API31才新增的MediaRecorder(Context)构造方法,导致低版本设备无法调用。按以下步骤修改即可解决:
1. 调整按钮点击事件
移除对API31的版本判断,直接调用startRecording():
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() } }
2. 重构startRecording()函数
- 移除
@RequiresApi(Build.VERSION_CODES.S)注解,解除低版本调用限制 - 适配
MediaRecorder初始化逻辑,区分API31前后的构造方法 - 处理低版本构造方法的过时警告
- 确保
setOutputFile传入绝对路径(适配低版本要求)
修改后的代码:
@SuppressLint("RestrictedApi") @Suppress("DEPRECATION") // 忽略低版本构造方法的过时警告 private fun startRecording() { stopBtn.isEnabled = true playBtn.isEnabled = false recordBtn.isEnabled = false val theAudioFile = File(getFilesDir(), "Audio_Record_File") 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.absolutePath) // 使用绝对路径适配低版本 setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) try { prepare() } catch (e: IOException) { Log.e(LOG_TAG, "prepare() failed", e) // 打印完整异常信息便于排查 } start() } }
关键说明
- 你之前尝试的适配写法无效,是因为函数本身的
@RequiresApi注解限制了外部调用,移除该注解后即可正常执行。 MediaRecorder()无参构造方法虽在API31后被标记为过时,但在低版本系统中仍能正常工作,添加@Suppress("DEPRECATION")可消除Android Studio警告。- 低版本的
setOutputFile方法推荐传入文件绝对路径,避免潜在兼容性问题。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

