4

Android用のsipアプリケーションをプログラミングしています。通話中は、マイク入力を録音し、着信音声を再生する必要があります。オプションでスピーカーフォンを使用する必要があります。Android 1.5+ (1.5、1.6、2.0、2.1、2.2、将来のバージョン) と互換性があり、デバイスをポータブルにする必要があります。

わかった。そのため、AudioTrack を使用して着信オーディオを再生し、AudioRecord を使用してマイクからのデータを記録し、AudioManager.setSpeakerphoneOn() を使用してスピーカーフォンを有効または無効にしています。

シンプルに聞こえますが、本来あるべきほどシンプルではありません。AudioManager.setMode(AudioManager.MODE_IN_CALL) が呼び出されない限り、AudioManager.setSpeakerphoneOn(false) は機能しません。だから私はMODE_IN_CALLにいなければなりません。

それでもOKでシンプルで、Android 1.6を搭載した私のG1、古い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); 
 }

どうもありがとうジャン

4

1 に答える 1

1

やってみて........

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

于 2011-07-14T11:00:33.270 に答える