3

我的广播获取调用,但PhoneStateListener不叫我的代码工作正常,当我在模拟器中运行,但是当我尝试在实际设备PhoneStateListener从来没有得到一个电话,我对这个nutts去问题 这里是我的代码:PhoneStateListener永远不会在广播机器人叫做

TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object 
          CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); 
          telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager 

上面的代码中的onReceive()方法,这里是我的课extensing PhoneStateListener 的onReceive()之外,但在广播类。

public class CustomPhoneStateListener extends PhoneStateListener { 

     private static final String TAG = "CustomPhoneStateListener"; 



     @Override 
     public void onCallStateChanged(int state, String phonenumber){ 

      if(phonenumber!=null && phonenumber.length()>0) 
       incoming_nr=phonenumber; 
      act=new Call_RecorderActivity(); 

      switch(state){ 
       case TelephonyManager.CALL_STATE_RINGING: 
         Log.d(TAG, "CALL_STATE_RINGING"); 
         prev_state=state; 


         break; 


       case TelephonyManager.CALL_STATE_OFFHOOK: 
       Log.d(TAG, "CALL_STATE_OFFHOOK"); 
       prev_state=state; 

       break; 


       case TelephonyManager.CALL_STATE_IDLE: 
        prev_state=state; 
        Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_nr); 



        break; 
        // Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 
        // |Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 

      } //switch close 
     } 
} 

logcat中显示了来电

01-22 11:25:12.529: I/IncomingCallReceiver(1463): Bundle[mParcelledData.dataSize=168] 
01-22 11:25:12.539: I/IncomingCallReceiver(1463): State: RINGING 
01-22 11:25:12.539: I/IncomingCallReceiver(1463): Incomng Number: +9184848xxxx2 
01-22 11:25:12.779: D/CustomPhoneStateListener(1463): CALL_STATE_IDLE==>+9184848xxxx2 
01-22 11:25:16.299: I/IncomingCallReceiver(1463): Bundle[mParcelledData.dataSize=92] 
01-22 11:25:16.299: I/IncomingCallReceiver(1463): State: OFFHOOK 
01-22 11:25:18.849: I/IncomingCallReceiver(1463): Bundle[mParcelledData.dataSize=88] 
01-22 11:25:18.849: I/IncomingCallReceiver(1463): State: IDLE 

与其相关的任何建议将提前

+0

确保你已经加入''android.permission.READ_PHONE_STATE许可,不得以舱单 –

+0

是的,我补充说,允许 –

+0

告诉我们你的日志和猫 – jenuine

回答

2

您的服务是越来越清理回调函数调用之前被接受 感谢这一点。在onReceive退出后,您不应该依赖BroadcastReceiver中分配的任何内容。您应该在ServiceActivity中输入CustomPhoneStateListener。然后,您可以使用Intent启动活动或服务来进行状态监控。

BroadcastReceiver文档,

一旦你的onReceive()返回时,广播接收器不再 活跃,它的宿主进程只是作为在它运行的任何其他 应用程序组件一样重要。尤其是 重要,因为如果该过程仅托管 BroadcastReceiver(对于用户具有 从未或最近未与之交互过的应用程序的常见情况),则在从 返回onReceive()时,系统将认为其进程是空和 积极杀死它,使资源可用于其他更多 重要的过程。

它在仿真器上工作的原因可能是因为仿真器上的进程总体较少,出于某种原因,它在关闭进程方面似乎较不积极。

+0

@ Auto-Droid它在模拟器上工作的原因可能是因为模拟器上的进程通常较少,并且出于某种原因,它在关闭进程方面似乎较不积极。因此,您的进程仍在模拟器的内存中,但不在设备上。它不会改变这样一个事实,即根据文档,您不能保证该流程将不会被保留。因此,上面写的代码可能会或可能不会对任何给定的调用起作用。 – iagreen

+0

我接受了可以检测到手机状态的服务,但我的服务被调用,但仍然存在我的听众没有接到呼叫的问题仍然存在 –

+0

您想要启动服务的广播意图是什么?我能够将你的代码复制到'Service'的'onStartCommand'中,并且它在真实设备上记录了所有状态消息。 – iagreen

0

对上述问题里边反的解决方案是:

private final PhoneStateListener phoneStateListener = new PhoneStateListener() { 

    @Override 

    public void onCallStateChanged(int state, String incomingNumber) { 

     String callState = "UNKNOWN"; 

     String myNumber = tm.getLine1Number(); 
     switch (state) { 

     case TelephonyManager.CALL_STATE_IDLE: 

      callState = "IDLE"; 
      if(Status!=""){ 
       Toast.makeText(mContext,"Call Ends " + incomingNumber,Toast.LENGTH_LONG).show(); 
      } 
      break; 

     case TelephonyManager.CALL_STATE_RINGING: 
      Status = "RINGING"; 
      if (incomingNumber.startsWith("00")) { 
       Toast.makeText(mContext,"International Call- " + incomingNumber,Toast.LENGTH_LONG).show(); 
       callState = "International - Ringing (" + incomingNumber+ ")"; 
      } else { 
       Toast.makeText(mContext, "Local Call - " + incomingNumber, Toast.LENGTH_LONG).show(); 
       callState = "Local - Ringing (" + incomingNumber + ")"; 
      } 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 

      try{ 
       String dialingNumber = mIntent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
       if(dialingNumber==null){ 
        Status = "Recieve"; 
        Toast.makeText(mContext, "Recieve call", Toast.LENGTH_LONG).show(); 
       }else{ 
        Status = "Dialing"; 
        if (dialingNumber.startsWith("00")) { 
         Toast.makeText(mContext,"International - " + dialingNumber,Toast.LENGTH_LONG).show(); 
         callState = "International - Dialing (" + dialingNumber+ ")"; 
        } else { 
         Toast.makeText(mContext, "Local Call - " + dialingNumber,Toast.LENGTH_LONG).show(); 
         callState = "Local - Dialing (" + dialingNumber + ")"; 
        } 
       } 
      }catch(Exception e){} 

      break; 

     } 

     Log.i(">>>Broadcast", "onCallStateChanged " + callState); 

     super.onCallStateChanged(state, incomingNumber); 

    } 

};