1

我可以在 READ_PHONE_STATE 事件中使用循环吗?

我想在电话开始响铃到结束响铃时循环工作。用户开始呼叫以断开呼叫的情况也相同。

这是我的广播接收器类

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        while (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            //wate for user shaking the phone
            //call ansered
        }           
        while (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            //do something while phone answered
            //I want to work something during the calling time
        }
        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) {
            //do some
        }
    }
}
4

2 回答 2

0

您可以检测何时接听/挂断来电,以及何时开始/停止拨出电话,以便在关联的回调中实现“循环”逻辑。我在下面的代码中包含了注释:

public abstract class PhoneCallReceiver extends BroadcastReceiver {
        static CallStartEndDetector listener;



@Override
public void onReceive(Context context, Intent intent) {
    savedContext = context;
    if(listener == null){
        listener = new CallStartEndDetector();
    }


        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}



public class CallStartEndDetector extends PhoneStateListener {
    int lastState = TelephonyManager.CALL_STATE_IDLE;
    boolean isIncoming;

    public PhonecallStartEndDetector() {}


    //Incoming call-   IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when hung up
    //Outgoing call-  from IDLE to OFFHOOK when dialed out, to IDLE when hunged up

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        if(lastState == state){
            //No change
            return;
        }
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                isIncoming = true;
                 //incoming call started
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                //Transition of ringing->offhook are pickups of incoming calls.  Nothing down on them
                if(lastState != TelephonyManager.CALL_STATE_RINGING){
                    isIncoming = false;
                   //outgoing call started
                }
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                //End of call(Idle).  The type depends on the previous state(s)
                if(lastState == TelephonyManager.CALL_STATE_RINGING){
                    // missed call
                }
                else if(isIncoming){
                      //incoming call ended
                }
                else{
                   //outgoing call ended                                              
                }
                break;
        }
        lastState = state;
    }

}

}

于 2014-07-28T14:57:11.523 回答
0

您已经完成了所有必要的研究,只是可能不是您想要做的“循环”。

您需要的是在电话响起时启动某些东西,并在它停止响铃时停止。通话中也一样。

要在电话响铃时处理事件,请在CALL_STATE_RINGING上开始执行某些操作,然后等待CALL_STATE_OFFHOOKCALL_STATE_IDLE知道响铃何时停止。

用户拨打电话时也是如此:当您的接收器收到CALL_STATE_OFFHOOK时启动某些内容,并在收到CALL_STATE_IDLE时停止。

我会让你的 BroadcastReceiver 在你的 UI 线程中发送一条消息(或调用一个函数)来做你需要做的事情,然后在调用状态发生变化时通知。

您不需要在这些时间间隔内循环。您只想在正确的时间开始/停止做某事。您可以随时设置一些备份安全性(例如:如果电话响了,但 3 分钟内没有任何事情发生,我停止做某事)以确保您不会在不想做的时候继续运行。

于 2014-07-28T12:40:40.837 回答