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

最近在做一个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();
    }

你可能感兴趣的:(android)