Android Studio Kotlin:Fragment录制音频存内部存储遇setAudioSource失败
问题:Fragment中MediaRecorder调用setAudioSource失败
使用Android Studio + Kotlin开发,尝试在Fragment页面录制音频并保存至内部存储时,持续出现setAudioSource failed异常,错误栈信息如下:
com.fypvpreventor.VpreventorFYP, PID: 23176 java.lang.RuntimeException: setAudioSource failed. at android.media.MediaRecorder.native_setAudioSource(Native Method) at android.media.MediaRecorder.setAudioSource(MediaRecorder.java:1923) at com.fypvpreventor.VpreventorFYP.fragments.SensorFragment.onViewCreated(SensorFragment.kt:89) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) at android.os.Handler.handleCallback(Handler.java:900) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
解决步骤
检查并申请录音权限
Android 6.0(API 23)及以上版本需动态申请RECORD_AUDIO权限,仅在Manifest声明无效。在Fragment中实现权限申请逻辑:private val RECORD_AUDIO_PERMISSION_REQUEST = 1001 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED ) { requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), RECORD_AUDIO_PERMISSION_REQUEST) } else { initMediaRecorder() } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == RECORD_AUDIO_PERMISSION_REQUEST) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initMediaRecorder() } else { Toast.makeText(requireContext(), "需要录音权限才能录制音频", Toast.LENGTH_SHORT).show() } } }同时在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-feature android:name="android.hardware.microphone" android:required="true" />确认AudioSource参数合法性
调用setAudioSource时必须使用有效常量,推荐使用MediaRecorder.AudioSource.MIC,避免使用已废弃或不存在的参数:mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)严格遵循MediaRecorder初始化顺序
MediaRecorder的配置步骤必须按以下顺序执行,否则会触发异常:setAudioSourcesetOutputFormatsetAudioEncodersetOutputFileprepare()
排查麦克风占用情况
若设备上有其他应用(如通话、语音助手)正在使用麦克风,当前应用无法获取麦克风控制权,导致setAudioSource失败。提示用户关闭相关应用后重试。确保内部存储路径正确
保存音频到内部存储时,使用应用专属目录避免权限问题:val outputFile = File(requireContext().filesDir, "recording.mp3") mediaRecorder.setOutputFile(outputFile.absolutePath)
内容的提问来源于stack exchange,提问作者Destroyer King
相关产品推荐
相关产品推荐

