Начать активность на BroadcastReceiver во время приема SIP-вызовов

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

public class IncomingCallReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {     

    SipAudioCall incomingCall = null;
    try {

        SipAudioCall.Listener listener = new SipAudioCall.Listener() {
            @Override
            public void onRinging(SipAudioCall call, SipProfile caller) {
                try {
                    call.answerCall(30);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        MainActivity wtActivity = (MainActivity) context;                       

        incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
        incomingCall.answerCall(30);
        incomingCall.startAudio();
        incomingCall.setSpeakerMode(true);

        wtActivity.call = incomingCall;

        wtActivity.updateStatus(incomingCall);

    } catch (Exception e) {
        if (incomingCall != null) {
            incomingCall.close();
        }
    }
}
}

person Umar Iqbal    schedule 25.03.2014    source источник


Ответы (1)


Привет, на вопрос уже был дан ответ в stackoverflow. В любом случае измените метод onRinging следующим образом.

SipAudioCall incomingCall = null;
try {

    SipAudioCall.Listener listener = new SipAudioCall.Listener() {
        @Override
        public void onRinging(SipAudioCall call, SipProfile caller) {

          super.onRinging(call, caller);
        }
    };

    MainActivity wtActivity = (MainActivity) context;                       

    incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
    //Method call which handles incoming call.
    showIncomingCall(intent, context);
    wtActivity.call = incomingCall;

    wtActivity.updateStatus(incomingCall);

} catch (Exception e) {
    if (incomingCall != null) {
        incomingCall.close();
    }
}

private void showIncomingCall(Intent intent, Context context) {

    Intent incomingCall = new Intent(context, IncomingCallActivity.class);
    context.startActivity(incomingCall);
}

public static void answerIncomingCall() {

    try {
        incomingCall.answerCall(30);
        incomingCall.startAudio();

        if (incomingCall.isMuted()) {
            incomingCall.toggleMute();

        }
    }

    catch (Exception e) {

        System.out.println(e.toString());
    }

}

public static void rejectIncomingCall() {

    try {
        if (incomingCall != null) {

            incomingCall.endCall();
            incomingCall.close();
        }

    } catch (Exception e) {

        System.out.println(e.toString());
    }
}

}

И в своем действии входящего вызова, где у вас есть кнопки «Ответить» и «Отклонить вызов», введите следующий код.

btnAnswer.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            IncomingCallReceiver.answerIncomingCall();

        }
    });

    btnDecline.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


            IncomingCallReceiver.rejectIncomingCall();
            finish();
        }
    });
person Allen    schedule 07.04.2014
comment
Я решил это, следуя руководству по Google, вызвав статические методы для приема/отклонения вызовов. в любом случае спасибо за вашу помощь. - person Umar Iqbal; 07.04.2014
comment
@UmarIqbal, не могли бы вы указать мне учебник, которому вы следовали? - person ylinkz; 14.12.2018