如何判断未接来电

Android没有未接电话的监视器,但是有个PhoneStateListener可以监听当前状态,所以如果想要处理未接来电事件的话可以通过监听手机状态的改变判断是否是未接来电然后再进行处理


实现思路:
     1.继承PhoneStateListener后当手机状态改变会调用onCallStateChanged函数。

     ● CALL_STATE_IDLE = 0 :空闲状态

     ● CALL_STATE_RINGING = 1 :响铃状态

     ● CALL_STATE_OFFHOOK = 2 :摘机状态(通话中)

     2.记录上次状态的改变和本次状态,若当前状态为空闲且上次状态为响铃则可认为是未接来电(实际上如果这样判断的话机主主动挂断电话也会被默认为未接电话,这个时候可以再加一层判断,即未接来电个数大于0的时候才默认为未接电话,这样就可以实现了)


准备步骤:
首先在正式写代码之前让我们先看看手机来电过程中状态是如何改变的。
监听代码如下:
public   class  CallReceive   extends   BroadcastReceiver  {

     @Override
     public   void   onReceive  (  Context  context,  Intent  intent) {
         TelephonyManager  tm = (  TelephonyManager ) context
                .  getSystemService  ( Context  .  TELEPHONY_SERVICE );

        tm.  listen  ( new  CallListener (),  PhoneStateListener  .  LISTEN_CALL_STATE );
    }

     public   class   CallListener  extends   PhoneStateListener  {

         private   int  lastState  TelephonyManager .  CALL_STATE_IDLE  ;

         @Override
         public   void  onCallStateChanged (  int  state,  String  incomingNumber) {
             //  TODO  Auto-generated method stub
             super  . onCallStateChanged  (state, incomingNumber);
               Log  .d(  "xxx" "hello state is "  + state +  " ---- incomimgNumber is "  + incomingNumber);
        }
    };

}

打印log如下: adb logcat -s xxx
响铃状态:
D/xxx     ( 3687): hello state is 1 ---- incomingNumber is 13950739450
D/xxx     ( 3687): hello state is 0 ---- incomingNumber is
呼叫方挂断:
D/xxx     ( 3687): hello state is 0 ---- incomingNumber is 13950739450
D/xxx     ( 3687): hello state is 0 ---- incomingNumber is 13950739450
D/xxx     ( 3687): hello state is 0 ---- incomingNumber is
这里存在一个本人觉得很奇怪的地方,在响铃的过程中会发出一次state = 0的状态,想了很久没明白,后面同事猜测说是因为这个状态改变只是发出去让开发者知道下然后就会切换为0的状态以便监听下一个电话,或许是这样吧,本人才疏学浅,暂时不知道怎么去跟踪。刚开始只是通过state去判断,因为这个万恶的0弄了很久,因为当来电过程中跑出个0导致在通话过程中就开始处理未接来电事件了。后面查看log发现当为0时incomingNumber是空的,然后再加上这个判断才算正确的判断了是否未接来电。


实现代码:

public   class   CallReceive   extends   BroadcastReceiver  {

     @Override
     public   void   onReceive   (  Context  context,  Intent  intent) {
         TelephonyManager  tm = (  TelephonyManager ) context
                .   getSystemService  ( Context   .  TELEPHONY_SERVICE );

        tm.   listen  ( new   CallListener (),  PhoneStateListener   .  LISTEN_CALL_STATE );
    }

     public   class   CallListener   extends   PhoneStateListener  {

         private   int   lastState   TelephonyManager .   CALL_STATE_IDLE  ;

         @Override
         public   void   onCallStateChanged (  int  state,  String  incomingNumber) {
             //  TODO  Auto-generated method stub
             super  . onCallStateChanged   (state, incomingNumber);
             System  . out   .  println (  "state is "  + state +  " -----   incomingNumber is "  + incomingNumber);

               if  ((state == 0) && ( lastState   == 1) && ! isNullOrEmpty   (incomingNumber)) {

                 sendMsgWhenMissedCall  ();
            }

             if  (! isNullOrEmpty   (incomingNumber))
                 lastState  = state;

        }

         private   void   sendMsgWhenMissedCall () {
        }

    }

     public   boolean   isNullOrEmpty   (  String  string) {
         return  (string.  equals (  "" ) || string ==  null  );
    }

}

在AndroidManifest.xml中注册此Receiver:
<  receiver   android:name  = ".CallReceive"   >
             <  intent-filter >
                 <  action   android:name  = "android.intent.action.PHONE_STATE"   />
             </  intent-filter >
         </  receiver >
另外记得加上监听电话状态改变的权限:
<   uses-permission   android:name   =  "android.permission.READ_PHONE_STATE"   />


至此,判断未接来电算是成功解决了,至于刚开始所说的获取未接来电个数的下次有空了再去实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值