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

Android录音程序运行抛出IOException、存储权限未申请问题求助

问题解决方案

1. 修复权限校验函数拼写错误

你提供的checkpermissions方法中存在拼写错误,PackageManager.PERMISSION_GRANTE少了末尾的D,正确值为PackageManager.PERMISSION_GRANTED,该错误会导致权限校验逻辑完全失效,就算用户已授予权限也会返回错误的校验结果:

private  fun checkpermissions(): Boolean {
    val result = ContextCompat.checkSelfPermission(applicationContext, WRITE_EXTERNAL_STORAGE)
    val result1 = ContextCompat.checkSelfPermission(applicationContext, RECORD_AUDIO)
    return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED
}

2. 适配不同Android版本的存储权限

Android系统存储权限随版本迭代有多次变更,是导致存储权限申请不弹窗的核心原因:

  • Android 10(API 29)以上废弃了WRITE_EXTERNAL_STORAGE权限,申请该权限不会弹出授权窗口
  • Manifest中声明的android.permission.STORAGE是无效权限,不存在该系统权限

Manifest修正代码:

<!-- 全版本都需要申请的录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- Android 13以下保留存储权限,高版本自动失效 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Android13及以上如需访问公共媒体库的音频文件再加,存在应用专属目录不需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" android:minSdkVersion="33" />

<application
    ...
    <!-- Android10临时兼容旧存储逻辑,可选,适配分区存储可去掉 -->
    android:requestLegacyExternalStorage="true">

权限申请逻辑适配代码:

private fun requestpermissions() {
    val permissionList = mutableListOf(RECORD_AUDIO)
    // 高版本不需要申请存储权限
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
        permissionList.add(WRITE_EXTERNAL_STORAGE)
    }
    ActivityCompat.requestPermissions(
        this@MainActivity,
        permissionList.toTypedArray(),
        REQUEST_AUDIO_PERMISSION_CODE
    )
}

3. 补充权限申请结果回调

你当前没有处理权限申请的用户操作结果,用户同意权限后不会自动触发录音逻辑,需重写回调方法:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_AUDIO_PERMISSION_CODE) {
        val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
        if (allGranted) {
            startRecording()
        } else {
            Toast.makeText(this, "需要授予录音和存储权限才能使用该功能", Toast.LENGTH_SHORT).show()
        }
    }
}

4. 验证输出路径合法性

MediaRecorder.prepare()抛出IOException大概率是传入的fileName路径不存在或无写入权限,优先使用应用专属存储目录,不需要额外申请存储权限即可读写:

// 生成合法的音频输出路径
val audioDir = getExternalFilesDir(Environment.DIRECTORY_MUSIC)
val audioFile = File(audioDir, "record_${System.currentTimeMillis()}.3gp")
val fileName = audioFile.absolutePath

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:09:04