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

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的配置步骤必须按以下顺序执行,否则会触发异常:

    1. setAudioSource
    2. setOutputFormat
    3. setAudioEncoder
    4. setOutputFile
    5. prepare()
  • 排查麦克风占用情况
    若设备上有其他应用(如通话、语音助手)正在使用麦克风,当前应用无法获取麦克风控制权,导致setAudioSource失败。提示用户关闭相关应用后重试。

  • 确保内部存储路径正确
    保存音频到内部存储时,使用应用专属目录避免权限问题:

    val outputFile = File(requireContext().filesDir, "recording.mp3")
    mediaRecorder.setOutputFile(outputFile.absolutePath)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:25:36