第二笔收入中的来电事件

问题描述 投票:0回答: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;
            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已经为true,则进入摘机状态(不执行任何操作(请勿更改保存的号码)所以我将摘机声明更改为此]

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个回答
0
投票

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

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

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.