我想实现一个自动应答的功能,比如“听到D声后请留言”。个人想象的解决方式是,把声音播放的输出设置成MIC,这样对方就可以听到了,那么怎么实现:当别人来电时,把自己预先准备好的音频输出设置成MIC,让对方听到?

期待各位的热烈发言!!!

推荐图书

  • Android 2高级编程(第2版)
  • Google Android SDK开发范例大全(第2版)
  • 疯狂Android讲义


1个回答

CallNotifier.java收到incoming消息后转到handleMessage()进行处理;

handleMessage()将incoming消息传给onNewRingingConnection()函数进行处理;

在onNewRingingConnection()函数中首先建立ringing连接,获取Call.State状态为INCOMING,然后通过PhoneApp的requestWakeState()函数唤起相应的状态(PARTIAL);

然后移除PHONE_AUTO_ANSWER消息;接着执行startIncomingCallQuery(c);

在函数startIncomingCallQuery中通过PhoneUtils的startGetCallerInfo()函数获取Caller的相关信息;

这样就完成了ringing的连接;

同时就完成了incoming状态的一个改变,进一步在CallNotifier的hangdleMessage中调用onPhoneStateChanged()函数处理相关状态的改变(包括通知PhoneApp状态改变,通知InCallScreen状态改变)。

InCallScreen受到状态改变的消息后在handleMessage中对之进行处理,即要调用InCallScreen的onPhoneStateChanged()函数进行处理。

回到CallNotifier.java中,当handleMessage()处理onCustomRingQueryComplete(),在该函数中会调用Ringer.java的响铃函数进行铃声通知ring(),接着再调用PhoneUtils.showIncomingCallUi();

显示UI(通过调用PhoneApp类的displayCallScreen()函数)。

下一步,如果接通电话,则走如下流程:

首先更新UI显示(调用CallCard.java的相关函数),然后进入InCallScreen的消息处理,接着进入PhoneUtils的answerCall()函数,在此函数中,会首先通过 PhoneApp.getInstance().getRinger().stopRing();停止响铃,然后更新UI页面。