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);
}
どうもありがとうジャン