You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 5.1.1通话录音服务启动崩溃问题求助

解决Android 5.1.1上通话录音MediaRecorder.start()抛出IllegalStateException的问题

从你的logcat报错和提供的代码来看,核心问题出在Android 5.1.1设备中使用MediaRecorder.AudioSource.VOICE_CALLS这个音频源上,下面给你梳理具体原因和可行的解决方案:

核心原因

MediaRecorder.AudioSource.VOICE_CALLS这个音频源并非所有Android设备都支持,尤其是在Android 6.0之前的系统中,多数厂商会将该音频源的访问权限限制为系统应用专属——第三方应用哪怕在Manifest里声明了权限,也无法正常调用这个音频源,最终导致调用start()时抛出IllegalStateException

解决方案

1. 替换为兼容性更强的音频源

对于Android 5.1.1这类旧版本设备,建议替换为更通用的音频源选项:

recorder = new MediaRecorder();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    System.out.println("Present in MIC");
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
} else {
    // 优先使用VOICE_COMMUNICATION,专为语音通话场景优化,兼容性更好
    recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
    // 如果VOICE_COMMUNICATION也无法使用,退而求其次用MIC(至少能录制己方声音,避免崩溃)
    // recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
}

2. 确保权限配置正确

AndroidManifest.xml中必须声明必要权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 如果需要存储录音文件,还需添加存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

虽然Android 5.1.1是安装时授权,但部分厂商会在系统层面额外限制录音权限,你可以引导用户在系统设置中检查应用的录音权限是否开启。

3. 完善异常捕获逻辑

你的代码目前只捕获了IOException,但IllegalStateException也需要被捕获,这样即使音频源不支持,也能避免应用崩溃,还能给用户友好提示:

try {
    recorder.prepare();
    recorder.start();
} catch (IOException e) {
    e.printStackTrace();
} catch (IllegalStateException e) {
    e.printStackTrace();
    // 这里可以添加用户提示,比如"当前设备不支持通话录音功能"
}

4. 兼容不同厂商的设备差异

不同品牌的Android 5.1.1设备对音频源的支持差异极大,Android没有直接的API检测设备是否支持某个音频源,你可以通过“尝试启动录音+捕获异常”的方式来判断当前设备是否支持通话录音,进而给出对应的处理逻辑。

额外说明

你在Android 6.0及以上版本使用MIC的逻辑是正确的——Google在Marshmallow之后限制了第三方应用对通话类音频源的直接访问,只能通过MIC录制通话(需要用户开启免提或使用耳机,才能录到双方声音)。

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

火山引擎 最新活动