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

