我正在开发一个VoIP应用程序,当用户拔下耳机然后设备自动切换到扬声器但我希望设备切换到普通扬声器时出现问题。有什么方法可以把它改成普通的发言人吗?
答案 0 :(得分:0)
要以编程方式打开耳机,请尝试以下操作:
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
private void useEarpiece() {
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(false);
}
检查您的许可:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
抓住事件:
private class HeadSetReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
switch (state) {
case 0:
// Headset unplugged
break;
case 1:
// Headset plugged in
break;
}
}
}
}
答案 1 :(得分:0)
棘手的东西,特别是多种设备方案。
我已经开发了一个VoIP应用程序,这就是我所知道的。您面临的问题可能是因为在请求焦点后手动处理音频管理器模式和/或流。您需要做的是将控制转移到呼叫流,以便在通话开启时,
耳机的连接和断开,转移到手机耳机等由o.s。
你可能正在做所有这些或组合......
使用AudioManager {.setMode(int mode)} - 使用MODE_IN_COMMUNICATION,推荐用于VoIP或MODE_IN_CALL
另外,请检查STREAM_VOICE_CALL
你正在使用吗? - isSpeakerphoneOn()和setSpeakerphoneOn(boolean) - isBluetoothScoOn(),setBluetoothScoOn(boolean)?需要针对设备或耳机型号特定问题解决所有问题。
有用的东西:
即使建立了SCO连接,也存在以下限制 应用于音频输出流,以便它们可以路由到SCO 耳机:
- 流类型必须为STREAM_VOICE_CALL
- 格式必须为mono
- 采样必须为16kHz或8kHz