Android开发如何知道电话有没有接通呢?
有这么一个场景,SOS拨号,列表里有3个号码。需要轮流拨号,但是呢,不同的客户不同的需求。
有些客户不管有没有被接听,3个号码,都要拨号,轮拨,拨打N次,如果是轮3次的话,那么就是要拨打9次。
有些客户又说,我只要拨通了就行,只要有一个拨通了,就不再往下拨打了。
有些客户又说,有些的确是有留言功能的,有些拨通是假拨通,比如说语音留言之类的, 它需要限制时间,超时了则要停止拨打,进入到下一个拨打。
你看吧,客户的需求是很多的,而且是多变的。
怎么设计这个策略呢?
定义三个变量,可配置的变量,不同的客户配不同的值即可。
- 超时时长,有些客户要求超时了必须挂断,拨下一个,不管有没有接听。默认为0,也就是按系统默认的,不进行超时挂断操作。
- 轮询次数,默认3次,也就是横向3次。
- 停拨策略:continue->无论如何继续拨,拨完此次循环;stop->如果拨打接听了,就停止拨号;loop,不管有没有接听,或者挂断,任何情况下都把次数轮询完。
获取通话状态
有了前面三个变量,应该就可满足前面的case了。
那么如何获取到通话状态呢?
对于监听状态,一点难度都没有,但是如何知道这个拨号有没有接通呢?android并没有给官方的接口方法。
其实也不难,我们在通话结束以后,去查询通话记录,判断通话时长,如果大于0的,表示已经接通过了。
private void checkHasRemoteAnswer() {
//hasRemoteAnswer
Log.d(TAG,"targetPhoneNum ==> " + targetPhoneNum);
String where = "number=?";
Cursor c = mContext.getContentResolver().query(
Uri.parse("content://call_log/calls"),
null,
where,
new String[]{targetPhoneNum},
"`_id` desc"
);
Log.d(TAG,"where is == > " + where);
if (c != null) {
int count = c.getCount();
ICLogger.d("int count ==> " + count);
if (c.moveToNext()) {
@SuppressLint("Range")
int duration = c.getInt(c.getColumnIndex("duration"));
Log.d(TAG,"duration is ==> " + duration);
hasRemoteAnswer = duration > 0;
}
c.close();
}
}
这样子就可以判断是否有进行通话了。