【问题标题】:incoming call event while second incomes第二收入时来电事件
【发布时间】:2020-03-12 20:12:59
【问题描述】:

我有一个应用可以在来电结束时做一些事情 我有一个带有两个标志的电话状态侦听器,仅检测已接听的收入电话并将电话号码存储到静态变量中以在通话结束时使用 一个标志,当电话响起时只检测收入,另一个标志,当电话应答时只为应答做事情

一切正常,但我发现如果在通话期间有另一个来电,那么即使拒绝它,我的应用也会为第二收入做一些事情

这是我的代码

public class ServiceReceiver extends BroadcastReceiver {

    static boolean is_incoming = false;
    static boolean in_call = false; //when incoming call ends check that call was answered
    public static String saved_number; //when call answers store number to use when ends
    static Context context;


    @Override
    public void onReceive(Context context, Intent intent) {
        ServiceReceiver.context = context;
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //when phone rings
            is_incoming = true;
            Toast.makeText(context, "ringing", Toast.LENGTH_SHORT).show();
        }
        if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer
            in_call = true;
            saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Toast.makeText(context, "offhook", Toast.LENGTH_SHORT).show();
        }
        if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){ // when reject or miss or ends


            if(in_call && is_incoming) { //answered incoming call ends

               doStuff(saved_number);
            }
            //making flags ready for next use
            in_call = false;
            is_incoming = false; 
        }

    }
}

我发现,当第二个来电来电时,第二个电话号码会以振铃状态发送广播,但当拒绝时,Android 似乎会发送一个带有第二个号码的摘机广播!

我自己的想法是如果 in_call 已经为真,则进入摘机状态什么都不做(不要更改保存的号码) 所以我把摘机语句改成了这个

if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer

            if(in_call){
                Toast.makeText(context, "inside checking", Toast.LENGTH_SHORT).show();
                //return;
            }

            saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            //Toast.makeText(context, "offhook for " + saved_number, Toast.LENGTH_SHORT).show();
            in_call = true;
        }

但我发现每次都显示“内部检查”吐司,我使用 !in_call 而不是 in_call 并且神奇地没有任何改变 如果取消注释返回应用程序崩溃

现在我很困惑为什么!!!

请帮忙

【问题讨论】:

    标签: android broadcastreceiver android-broadcast telephonymanager phone-state-listener


    【解决方案1】:

    幸运的是我可以解决问题 我只是将保存号码移动到振铃语句(并从摘机中删除)并仅在当前未通话时保存号码 最终代码:

    public class ServiceReceiver extends BroadcastReceiver {
    
        static boolean is_incoming = false;
        static boolean in_call = false; //when incoming call ends check that call was answered
        public static String saved_number; //when call answers store number to use when ends
        static Context context;
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
            ServiceReceiver.context = context;
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //when phone rings
                is_incoming = true;
                if(!in_call){
                    saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Toast.makeText(context, "ringing by: " + saved_number, Toast.LENGTH_SHORT).show();
                }
            }
            if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer
                in_call = true;
                Toast.makeText(context, "offhook", Toast.LENGTH_SHORT).show();
            }
            if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){ // when reject or miss or ends
    
    
                if(in_call && is_incoming) { //answered incoming call ends
    
                   doStuff(saved_number);
                }
                //making flags ready for next use
                in_call = false;
                is_incoming = false; 
            }
    
        }
    }
    

    可能导致在摘机时检查此问题的唯一原因是当呼叫接受时,摘机接收到多次!

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2010-10-20
      相关资源
      最近更新 更多