由于需要,作了一个小小的程序,实现了当收到一个特定intent的时候会从联系人的第一个人开始按照顺序循环拨号的功能。期间参考了网上前辈的代码,还有他们所给出的启示。
碰到的最主要的问题是电话状态的监听,官方API只给出了三种拨号状态:CALL_STATE_IDLE,CALL_STATE_OFFHOOK,CALL_STATE_RINGING。IDLE是空闲的意思,也就是电话闲着没事干的状态既不响也不挂;OFFHOOK是挂断,也就是你挂电话的那个动作;RINGING则是响铃的意思,但是你的电话要响,所以往外拨号的时候,电话的状态是不会触发RINGING状态的,因为没响~~
现在问题来了,在打电话的过程中只有两个状态可用:IDLE以及OFFHOOK,所以电话打通了没有就成了个问题,而不知道到底打通了没有就没办法判断是否继续打下去。关于接通的监听有两种思路,一种是想办法用framework中的isalive方法,这个我没有用。另一种是个很笨的土方法:查询上一次的通话记录,大于0就是接通,等于0就是没通。我用的就是方法二。
然后就是用反射机制来调用endcall,这个网上有很多可供参考的代码很容易做到。
整个程序的大致思路很简单,定义一个receiver,接到特定intent后就startService,在自定义的Service中需要用到两个AsyncQueryHandler和一个PhoneStateListener。
PhoneStateListener用来监听电话的状态:IDLE、OFFHOOK。
AsyncQueryHandler一个用来查询联系人,以便一个接一个的不停打,打通为止,不通就一直打。另外一个用来查询通话记录,查寻最后一次通话的dur的值,等于0就继续打,大于0就直接endcall、stopself。
逻辑上我把拨号的动作放在了IDLE中处理,而判断是否继续拨号的逻辑放在了OFFHOOK中,由于查询通话记录会有大概1秒的延迟,所以如果刚刚拨通不到1秒就挂电话的话,还是会拨后续号码,但是只要查询处理完成,就会立即endcall,并不会真正将下一个号码拨出去。通话时间只要大于2秒,就可以完美的在电话接通之后彻底中断程序,不会继续拨打。
源码中的manifest文件中的intent-filter我设为了android.intent.action.anything,修改之后就可以使用。主要就是一个service文件,只要绑了这个service就会立马开始打电话,从联系人的第一个开始,打不通不罢休。。。打通了,就能挂断了,不然挂不掉电话很麻烦(建议关机㓏)。。。慎用。
程序稍作修改就可以做到火车票订票电话的效果,不过最好再作一个挂电话的功能,不然一直打不通就真的只能关机了。。。
源码地址:http://download.csdn.net/detail/wcnmcsnm/6025175