Android запись и воспроизведение + громкая связь в качестве опции - PullRequest
4 голосов
/ 16 ноября 2010

Я программирую 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); 
 }

Большое спасибо Jan

1 Ответ

1 голос
/ 14 июля 2011

Попробуйте ........

AudioManager audio = (AudioManager) context.getSystemService (Context.AUDIO_SERVICE);audio.setRingerMode (AudioManager.RINGER_MODE_NORMAL);

...