No ringing event on incoming calls

2019-05-02 20:54发布

问题:

I don't know where is a problem. Listener doesn't catch onRinging event (so I can decide will I accept or reject incoming calls). in manifest is this:

<uses-permission android:name="android.permission.USE_SIP" />

in main activity onCreate is this:

IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
...
SipManager manager = SipManager.newInstance(this);
Intent i = new Intent();
i.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
manager.open(me, pi, null);

in BroadcastReceiver class is this:

public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
...
@Override
public void onCallEnded(SipAudioCall call) {
// TODO Auto-generated method stub
super.onCallEnded(call);
}
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
call.startAudio();
call.setSpeakerMode(true);
if(call.isMuted()) {
call.toggleMute();
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
wtActivity.call = incomingCall;
...

I recieve CallEnd event and onChanged (after I end call) but I dont recieve onRinging event. what could be a problem? Thnx

EDIT : I changed it all. I put new intent filter to receiver like this (bold):

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver">
    **<intent-filter>  
        <action android:name="android.intent.action.PHONE_STATE" />  
    </intent-filter>**  
</receiver>

and I changed BroadcastReceiver inherit class like this (bold one):

@Override
public void onReceive(Context context, Intent intent) {
    try {
        **PhoneStateListener phoneListener=new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
        // TODO Auto-generated method stub
        Log.d("DEBUG", "Phone listener....");
        String stateString = "N/A";
        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:
        stateString = "Idle";
        break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
        stateString = "Off Hook";
        break;
        case TelephonyManager.CALL_STATE_RINGING:
        stateString = "Ringing";
        break;
    }
}
};**
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
SipSession ses=wtActivity.manager.getSessionFor(intent);
**TelephonyManager telephony = (TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE);  
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);**
...

Now I get only IDLE state but still there is no ringing.

回答1:

There is an error in the source code of SipAudioCall class.

To work around this issue:

incomingCall = wtActivity.manager.takeAudioCall(intent, null);
incomingCall.setListener(listener, true);


回答2:

I have implemented same scenario to accept or reject incoming call in sip demo. Create your own Activity (IncomingGui.java) with two buttons Accept and Reject. In BroadcastReciever class call your Activity(IncomingGui.java) on incoming call event.

        WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
        incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
        showIncomingCallGui(intent, context); 
        wtActivity.call = incomingCall;

Then define following methods in BroadcastReciever class

    public void showIncomingCallGui(Intent intent,Context context) {

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

public static void answerIncomingCall(){

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

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

Then in IncomingGui.java define following methods behind "Accept" and "Reject" Buttons. Now on incoming call you will have your own incoming call activity to accept or reject call.

    public void onCallAcceptButton(View view){
    IncomingCallReceiver.answerIncomingCall();
}

    public void onCallRejectButton(View view){
    IncomingCallReceiver.rejectIncomingCall();
    this.finish();

}