No hay evento de llamada en las llamadas entrantes

No sé dónde está un problema. El oyente no captura el evento onRinging (por lo que puedo decidir si acepto o rechazo las llamadas entrantes). En manifiesto es esto:

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

En la actividad principal onCreate es la siguiente:

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

En la clase BroadcastReceiver es la siguiente:

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

CallEnd evento CallEnd y onChanged (después de terminar la llamada) pero no onRinging evento onRinging . Lo que podría ser un problema? Thnx

EDIT: Lo cambié todo. Pongo nuevo filtro intención al receptor como este (negrita):

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

Y cambié BroadcastReceiver heredar clase como esta (en negrita):

 @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);** ... 

Ahora consigo solamente el estado IDLE pero todavía no hay anillo.

He implementado el mismo escenario para aceptar o rechazar llamadas entrantes en sip demo. Crea tu propia actividad (IncomingGui.java) con dos botones Aceptar y Rechazar. En la clase BroadcastReciever llame a su Actividad (IncomingGui.java) en un evento de llamada entrante.

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

A continuación, defina los siguientes métodos en la clase BroadcastReciever

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

A continuación, en IncomingGui.java definir los siguientes métodos detrás de "Aceptar" y "Rechazar" Botones. Ahora en la llamada entrante usted tendrá su propia actividad entrante de la llamada para aceptar o rechazar la llamada.

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

Hay un error en el código fuente de la clase SipAudioCall.

Para evitar este problema:

 incomingCall = wtActivity.manager.takeAudioCall(intent, null); incomingCall.setListener(listener, true); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.