【问题标题】:Android READ_PHONE_STATE EventAndroid READ_PHONE_STATE 事件
【发布时间】:2014-09-19 15:31:58
【问题描述】:

我可以在 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
        }
    }
}

【问题讨论】:

    标签: java android loops broadcast receiver


    【解决方案1】:

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

    您需要的是在电话响起时开始某件事,并在它停止响起时停止。通话中也一样。

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

    在用户拨打电话时也是如此:当您的接收者收到CALL_STATE_OFFHOOK 时开始某事,并在收到CALL_STATE_IDLE 时停止。

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

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

    【讨论】:

    • 我想开发一个摇一摇接听应用程序,当手机响铃时,用户摇一摇手机:来电被接听。用户摇晃 2 次:通话被拒绝
    【解决方案2】:

    您可以检测何时接听/挂断来电,以及何时开始/停止去电,因此在相关回调中实现“循环”逻辑。我在下面的代码中包含了 cmets:

    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;
        }
    
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2018-03-07
      • 2016-09-13
      • 2017-01-06
      • 2015-12-17
      相关资源
      最近更新 更多