android监听通话时长只针对在APP中拨打电话

xiaoxiao2021-02-28  55

最近在做一个OA系统,需求极其恶心,就不吐槽了其中的一个需求就是要监听通话的时长,拿到这个需求马上就想到读取通话记录,但是也还有问题啊,打完电话马上要干别的事,而遍历通手机话记录需要耗时,于是就跟设计狗讨论下,只计算从他在APP按拨号键到结束通话回到该界面的通话时长就可以了,这就很简单了,用PhoneStateListener 就可以实现。下面来看代码

//通话监听 private TelephonyManager tm; private MyPhoneListener MyPhoneListener; private long callTime;//通话时长 private long firstCallTime;//点击拨号时候的时间 private boolean isCall = false;//是否拨打过电话 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_customer_info); //监听通话 tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); MyPhoneListener = new MyPhoneListener(); tm.listen(MyPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); } /** * 监听通话时长 */ class MyPhoneListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE://空闲 System.err.println(" 空闲"); if (isCall) { callTime = System.currentTimeMillis() - firstCallTime; } break; case TelephonyManager.CALL_STATE_RINGING://响铃 System.out.println("发现来电!!!!!"); break; case TelephonyManager.CALL_STATE_OFFHOOK://通话状态 isCall = true; firstCallTime = System.currentTimeMillis(); System.out.println("通话状态!!!!!"); break; default: break; } } }

PhoneStateListener 用于监听手机通话状态的,三个状态意思如下 1.CALL_STATE_IDLE:此时手机处于空闲状态, 2.CALL_STATE_RINGING:此时处于来电状态 3.CALL_STATE_OFFHOOK:通话状态

PhoneStateListener 一开始监听手机就处于空闲状态,当主动拨打电话时,此时处于通话状态,当挂断电话时又回到空闲状态,你可以自己打印日志查看PhoneStateListener 的状态。知道打电话到挂断的状态后计算时间就很简单了。 firstCallTime 就是点拨号键开始打电话的时间,挂断回到空闲状态,用currentTimeMillis()-firstCallTime 就是通话时长,想不通就多想多测试。

你以为这样就完了,这样是可以监听到通话时长,但是同时问题也出现了,打电话时间很长的时候,当手机内存不足可能将PhoneStateListener 回收,所以不管怎么打电话通话时长一直为0,测试人员告诉我的时候很郁闷啊,我的手机上一点问题都没有,他测的就有问题(他用的手机只有2G内存),之后也是想到这个原因,所以写了一个服务,在服务里监听通话,在状态变为空闲的时候发送条广播,把calltime发送出去,activity接收,这样就没问题了。服务就不发代码了,很简单跟上面差不多就是发送个广播,在activity中接收就可以了,是在不会的留言吧。最后别忘了

@Override public void onDestroy() { //取消电话监听 tm.listen(MyPhoneListener, PhoneStateListener.LISTEN_NONE); super.onDestroy(); }
转载请注明原文地址: https://www.6miu.com/read-82645.html

最新回复(0)