Android 5.1.1通话录音服务启动崩溃问题求助
从你的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




