Android запись и воспроизведение + громкая связь в качестве опции
Я программирую SIP-приложение для Android. Во время разговора я должен записать вход микрофона и воспроизвести входящий звук. Там должно быть дополнительное использование громкой связи. Он должен быть совместим с Android 1.5+ (1.5, 1.6, 2.0, 2.1, 2.2, будущие версии) и переносимым устройством.
ХОРОШО. Поэтому я использую AudioTrack для воспроизведения входящего аудио, AudioRecord для записи данных с микрофона и AudioManager.setSpeakerphoneOn() для включения или отключения громкой связи.
Звучит просто, но это не так просто, как должно быть. AudioManager.setSpeakerphoneOn(false) не работает, если не вызывается AudioManager.setMode(AudioManager.MODE_IN_CALL). Так что я должен быть в MODE_IN_CALL.
Все еще хорошо и просто, и это работает на моем G1 с Android 1.6, более старым телефоном Samsung, эмуляторами, многими устройствами наших клиентов и т. Д. Но это не работает везде:(
На планшете Samsung GT-P1000 я получаю поток 0, 0, 0, 0, ... в качестве входа микрофона. Я думаю, что та же проблема на телефонах Motorola (клиенты жалуются). После некоторого теста я понял, что это вызвано AudioManager.setMode(AudioManager.MODE_IN_CALL). Это приводит к тому, что микрофон не работает на некоторых устройствах. Но я должен позвонить, потому что иначе я не могу отключить громкую связь.
Есть ли простой способ, как сделать это просто, правильно и работать? И если это возможно, без ада, как Sipdroid очень опасный исходный код:
if (RtpStreamReceiver.samsung) {
AudioManager am = (AudioManager) Receiver.mContext.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_CALL);
am.setMode(AudioManager.MODE_NORMAL);
}
или же
void initMode() {
samsung = Build.MODEL.contains("SAMSUNG") || Build.MODEL.contains("SPH-") ||
Build.MODEL.contains("SGH-") || Build.MODEL.contains("GT-");
if (Receiver.call_state == UserAgent.UA_STATE_INCOMING_CALL &&
(Receiver.pstn_state == null || Receiver.pstn_state.equals("IDLE"))) {
setMode(AudioManager.MODE_NORMAL);
}
Большое спасибо Ян
1 ответ
Попробуйте это........
AudioManager audio = (AudioManager) context.getSystemService (Context.AUDIO_SERVICE); audio.setRingerMode (AudioManager.RINGER_MODE_NORMAL);