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

来源:互联网 发布:天谕动漫人物捏脸数据 编辑:程序博客网 时间:2024/04/28 05:07

最近在做一个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();    }
阅读全文
0 0
原创粉丝点击