событие входящего звонка, а второй доход - PullRequest
0 голосов
/ 12 марта 2020

У меня есть приложение для выполнения некоторых задач после завершения входящего вызова. У меня есть прослушиватель состояния телефона с двумя флагами, позволяющий обнаруживать только поступившие звонки и сохранять телефонный номер в переменной stati c, которую можно использовать, когда вызов заканчивается одним флагом, когда телефон Звонит, чтобы определить только доход, и другой флаг, когда ответы на вызовы делают вещи только для отвеченных

все работает правильно, но я обнаружил, что если во время вызова поступает другой входящий, то мое приложение выполняет вещи для второго дохода, даже если отклонить его

вот мой код

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 отправляет широковещательную рассылку со вторым число!

моя собственная идея заключается в том, чтобы внутри состояния offhook, если in_call уже true, ничего не делать (не изменять сохраненный номер), поэтому я изменил выражение offhook на это

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 и волшебным образом изменилось, и если uncomment return приложение вылетает

, теперь я так растерялся, почему !!!

, пожалуйста, помогите

1 Ответ

0 голосов
/ 13 марта 2020

К счастью, я мог решить проблему. Я просто переместил сохраненный номер в оператор вызова (и удалил из ответа) и сохранил номер, только если в данный момент нет окончательного кода вызова:

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

    }
}

единственная причина, которая может причиной проверки этого на offhook является то, что offhook получает более одного раза, когда вызов принимает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...