3

我的广播被调用但没有调用 PhoneStateListener 我的代码在模拟器中运行时工作正常但是当我在实际设备上尝试它时 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() 方法中,这是我的类在 onReceive() 之外扩展 PhoneStateListener 但在广播类中。

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

任何与之相关的建议都将被接受提前谢谢

4

2 回答 2

2

在调用回调之前,您的服务已被清理。你不应该真的依赖分配给你的任何东西在退出BroadcastReceiver后存在。onReceive你应该CustomPhoneStateListener输入Serviceor Activity。然后您可以使用Intent启动活动或服务来进行状态监控。

BroadcastReceiver文档中,

从 onReceive() 返回后,BroadcastReceiver 不再处于活动状态,它的托管过程仅与在其中运行的任何其他应用程序组件一样重要。这一点尤其重要,因为如果该进程仅托管 BroadcastReceiver(用户从未或最近没有与之交互的应用程序的常见情况),那么在从 onReceive() 返回时,系统将认为其进程为空并主动终止以便资源可用于其他更重要的流程。

它在模拟器上工作的原因可能是因为模拟器上的进程通常较少,并且由于某种原因,它似乎不太积极地杀死进程。

于 2013-01-22T05:53:18.937 回答
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);  

    }  

}; 
于 2013-03-12T08:45:44.410 回答